WPF uygulamasından programlı olarak nasıl çıkarım?


478

Birkaç yıl içinde C # (Windows Forms) kullanıyorum, hiç WPF kullanmadım. Ancak, şimdi WPF'yi seviyorum, ancak kullanıcı Dosya menüsünden Çıkış menü öğesini tıkladığında uygulamamdan nasıl çıkmam gerektiğini bilmiyorum.

Denedim:

this.Dispose();
this.Exit();
Application.ShutDown();
Application.Exit();
Application.Dispose();

Diğerleri arasında. Hiç birşey çalışmıyor.

Yanıtlar:


781

Uygulamanızdan çıkmak için arayabilirsiniz

System.Windows.Application.Current.Shutdown();

Application.ShutdownYöntemin belgelerinde açıklandığı gibi, bir ShutdownMode belirterek uygulamanızın kapatma davranışını da değiştirebilirsiniz :

Kapatma, aşağıdaki durumlarda Windows Presentation Foundation (WPF) tarafından örtük olarak çağrılır:

  • ShutdownMode OnLastWindowClose olarak ayarlandığında.
  • ShutdownMode OnMainWindowClose olarak ayarlandığında.
  • Kullanıcı bir oturumu sonlandırdığında ve SessionEnding olayı işlenmez veya iptal edilmeden işlenir.

Ayrıca Application.Current.Shutdown();, yalnızca Applicationnesneyi oluşturan iş parçacığından ( normalde ana iş parçacığından) çağrılabileceğini de unutmayın .


8
Belirttiğim gibi garip değil. WPF Uygulama statik bir sınıftır. Application.Current şu anda çalışan Uygulamanız için bir referanstır.
TimothyP

4
Benim düşünceme göre, bu ilk bakışta belirgin değil ve bu da insanları atmak için geçmiş modellerden yeterince sapmış olması açısından biraz garip. Elbette çalıştığı mükemmel bir mantıklı.
Brian MacKay

20
Arama yaparsanız Application.Current.Shutdown();fonction hemen dönmez. Bunun için de aramalısın return;.
Erwin Mayer

2
Ben bir pencereden başka bir pencere açılır ve bu pencerenin window_closed olay ben bu kodu ekledi bu kullandık. tüm pencereler kaybolur, ancak program pop-up'ın oluşturulduğu yerden sonra da çalışır.
diyoda_

7
@TimothyP No Applicationstatik bir sınıf DEĞİLDİR. Application.CurrentStatik bir üyeye sahip olmak, statik olduğu anlamına gelmez. Bunun yerine, türetilebilen normal bir sınıftır.
Earth Engine

156

Eğer varsa gerçekten kapatmak için ihtiyaç da kullanabilirsiniz Environment.Exit () , ama hepsi de zarif değil (daha işlemini biten gibi).

Aşağıdaki gibi kullanın:

Environment.Exit(0)

4
Environment.Exit()en az bir parametreye, bir çıkış koduna ihtiyaç duyar. Environment.Exit(0)Çıkış koduyla ilgili endişeleriniz yoksa kullanın .
gbmhunter

24
Bu yöntem aslında her şeyi kapattı. Uygulamam çalışmakta olan bir şeyi terk ediyordu (form kapanıyordu, ancak bir süreç hala devam Application.Current.Shutdown();
ediyordu

4
Ortam.Exit, bir uygulamanın kapatılmasını sağlamak için kesinlikle doğru yoldur. Application.Current.Shutdown ile, kendini dağıtıcının içine iten bir kodunuz varsa, uygulamanın süresiz olarak çalışmasını sağlayabilirsiniz.
Marcus Andrén

Application.exit (0) kadar eşit;
Sayka

İle Application.Current.Shutdown();benim Closingolay çağrıldı, ne zaman basitçe hemen benim app kapatma istedi. Bu Environment.Exit(0);daha iyi bir seçim oldu.
FredM

64

Gibi wuminqi söyledi , Application.Current.Shutdown();geri çevrilemez ve bunu genellikle böyle bir kullanıcı oturum kapatma veya Windows kapatılıyor olduğu gibi zamanlarda yakın bir uygulama zorlamak için kullanılır inanıyoruz.

Bunun yerine, this.close()ana pencerenizden arayın . Bu, Alt+ F4ya da pencerede [x] kapat düğmesine basmakla aynı şeydir. Bu, sahip olunan diğer tüm pencerelerin kapanmasına neden olur Application.Current.Shutdown();ve kapatma eylemi iptal edilmediği sürece son bulur. Lütfen Pencereyi Kapatma hakkındaki MSDN belgelerine bakın .

Ayrıca, this.close()iptal edilebilir olduğundan , kapanış olay işleyicisine bir değişiklikleri kaydetme onay iletişim kutusu koyabilirsiniz. Sadece bir olay işleyicisi yapın <Window Closing="...">ve e.Cancelbuna göre değiştirin . (Bunun nasıl yapılacağı hakkında daha fazla bilgi için MSDN belgelerine bakın .)


2
+1 Özellikle uygulamadan çıkmadan önce açık dosyaları kaydetmem gerektiğinden bununla gitmeye karar verdim.
AgentKnopf

2
Burada dikkat edilmesi gereken önemli bir nokta, Allen'ın çok önemli bir gerçeği işaret etmesidir: sahip olunan diğer tüm pencereler kapatılacaktır. Sahiplik bildirdiğinizden emin olmalısınız. Çalışmakta olan bir pencereniz varsa ve başka bir pencere açar ancak henüz göstermezseniz, etkin pencereyi kapattıktan sonra gizli pencere uygulamayı çalışmaya devam etmeye zorlar. Pencereyi başka yollarla (görev yöneticisi vb.) Kapatmazsanız, potansiyel bir bellek sızıntısı yaşarsınız. Bunu test ettim.
BK

35

Aşağıdakilerden herhangi birini gerektiği gibi kullanın:

1.

 App.Current.Shutdown();
OR
 Application.Current.Shutdown();

2.

 App.Current.MainWindow.Close();
OR
 Application.Current.MainWindow.Close();

Her şeyden önce closing event, Windowsınıf çağrısı ve yürütme bir noktada durabilir (genellikle bir uygulama tamamen kapatılmadan önce ' emin misiniz?' Veya ' Kapatmadan önce verileri kaydetmek ister misiniz? '

3. Ancak uygulamayı herhangi bir uyarı yapmadan derhal sonlandırmak isterseniz . Aşağıda kullanın

   Environment.Exit(0);


18

Benimkini şöyle yaparım:

// Any control that causes the Window.Closing even to trigger.
private void MenuItemExit_Click(object sender, RoutedEventArgs e)
{
    this.Close();
}

// Method to handle the Window.Closing event.
private void Window_Closing(object sender, CancelEventArgs e)
{
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...",
                                   MessageBoxButton.YesNo, MessageBoxImage.Exclamation);
    if (response == MessageBoxResult.No)
    {
        e.Cancel = true;
    }
    else
    {
        Application.Current.Shutdown();
    }
}

Ben sadece Application.Current.ShutDown()ana uygulama penceresinden çağırıyorum , diğer tüm pencereleri kullanın this.Close(). Ana penceremde Window_Closing(...)sağ üstteki xdüğmeyi işler . Yöntemlerden herhangi biri pencereyi daha yakına çağırırsa, Window_Closing(...)kullanıcı onaylarsa etkinliği kapatır.

Aslında Application.Current.Shutdown()ana penceremde kullanmamın nedeni , bir tasarım hatası yapıldıysa ve bir uygulamada pencerelerimden birinin üst öğesini bildirmediysem, bu pencere daha önce gösterilmeden açılırsa son aktif pencerenin kapanışına kadar, arka planda çalışan gizli bir pencere bıraktım. Uygulama kapanmayacak. Tam bellek sızıntısını önlemenin tek yolu uygulamayı kapatmak için Görev Yöneticisi'ne gitmektir . Application.Current.Shutdown()beni istenmeyen tasarım kusurlarından korur.

Bu benim kişisel deneyimimden. Sonunda, senaryonuz için en iyisini kullanın. Bu sadece başka bir bilgi parçası.


16

Bir Application.ShutDown();veya .Exit()mesaj olmamalıdır .

Applicationstatik bir sınıftır. Mevcut uygulamaya atıfta bulunmaz. Geçerli uygulamaya gitmeniz ve ardından şu şekilde kapatmanız gerekir:

Application.Current.Shutdown();

8

Bunu yapmanın başka bir yolu:

System.Diagnostics.Process.GetCurrentProcess().Kill();

Bu, başvurunuzu öldürmeye zorlar. Çok iş parçacıklı bir uygulamada bile her zaman çalışır.

Not: Sadece başka bir evrede kaydedilmemiş verileri kaybetmemeye dikkat edin.


Bu anlaşılmaz görünüyor: "süreçte her zaman işe yarar" . Tamir edebilir misin? Ya da en azından burada ne demek istediğinizi açıklayın?
Peter Mortensen

Bu da kısmen anlaşılmaz: Başka bir iş parçacığından dosyalara veri kaydeden bir uygulamaya dikkat edin. Tamir edebilir misin? Ya da en azından burada ne demek istediğinizi açıklayın?
Peter Mortensen

Google Translate kullanıyor musun?
Peter Mortensen

hayır yapmıyorum, demek istediğim uygulama çok iş parçacığı olarak çalışıyor ve Process.Kill kullanacaksınız, ancak bunun gibi başka bir yol. başka bir iş parçacığı çalışırken çok iş parçacıklı uygulamalarda çalışmayan kapatın.
Ali Yousefi

6
private void _MenuExit_Click(object sender, RoutedEventArgs e)
{
   System.Windows.Application.Current.MainWindow.Close();
}

//Override the onClose method in the Application Main window

protected override void OnClosing(System.ComponentModel.CancelEventArgs e)
{
    MessageBoxResult result =   MessageBox.Show("Do you really want to close", "",
                                          MessageBoxButton.OKCancel);
    if (result == MessageBoxResult.Cancel)
    {
       e.Cancel = true;
    }
    base.OnClosing(e);
}

Bu sadece wpf uygulamasından nasıl çıkacağını bilmek istediği soru cevabı değildir.
mehdi

6

Deneyin

App.Current.Shutdown();

Benim için

Application.Current.Shutdown(); 

işe yaramadı.


6

Anladığım kadarıyla Application.Current.Shutdown()dezavantajı var.

Kullanıcıların çıkıp çıkmadıklarını doğrulamasına izin vermek için bir onay penceresi göstermek istiyorsanız Application.Current.Shutdown(), geri döndürülemez.


7
Bunu anlamıyorum. Application.Current.Shutdown()Ancak aramadan önce kullanıcı onayı alabiliriz .
Amsakanna

2
Neden onaylaman gerektiğini anlamıyorum. Çok fazla onay çok kötü bir şey. Birinin Dosya menüsünü açmak, Dosya menüsünün en altına inmek ve ardından Çıkış'ı tıklamak için çaba göstermesi, artık uygulamayı kullanmak istemediklerini doğrulamaktadır.

Veer: Benim durumumda, onay penceresi görünür, ancak onayda "iptal" seçeneğini seçseniz bile, ana APP çıkar.
wuminqi

7
JTS: Bu duruma göre tasarlanmak daha iyidir. Uygulamamız, çalışan işler varsa, güç çıkışı hasarlara neden olur, bu yüzden onay iletişim kutusunda bilgilendirilmelerine izin
veririz

3

Özetle, bunu yapmanın birkaç yolu vardır.

1) Sonlandırma, hata işleme vb.

Process.GetCurrentProcess().Kill();

2) Çıkış olaylarını çağırdığı için muhtemelen doğru yol olan geçerli uygulamayı kapatma:

Application.Current.Shutdown();

veya

this.Shutdown();

(bir App sınıfı örneğinde clledildiğinde)

3) Geçerli uygulamayı kapatma (tüm formların daha önce kapatılması / bitirilmesi gerekir):

this.Close(); 

(bir App sınıfı örneğinde clledildiğinde)

4) Uygulamayı sonlandıran ortamdan çıkma:

Environment.Exit(0);

Ayrıca, çıkış istatistiklerini burada okumak isteyebilirsiniz


2

Kaliburn mikro aromalı

public class CloseAppResult : CancelResult
{
    public override void Execute(CoroutineExecutionContext context)
    {
        Application.Current.Shutdown();
        base.Execute(context);
    }
}

public class CancelResult : Result
{
    public override void Execute(CoroutineExecutionContext context)
    {
        OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true });
    }
}

Ne yapar "Caliburn mikro aromalı" demek?
Peter Mortensen

Caliburn Micro kullanarak bunu nasıl başardınız
Anders

0

Uygulama nesnesi oluşturmayan başka bir iş parçacığından çıkmak istiyorsanız şunu kullanın:

System.Windows.Application.Current.Dispatcher.InvokeShutdown();

-2

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;


2
SO, Alpha-LIon'a hoş geldiniz! Sorunun nasıl çözüldüğüne dair hiçbir fikir vermediklerinden, yalnızca kod yanıtları burada önerilmez. Lütfen çözümünüzü, kodunuzun OP'nin sorununu nasıl çözdüğüne dair bir açıklama ile güncelleyin :)
Joel

-3

Xaml kodundan, önceden tanımlanmış bir SystemCommand öğesini çağırabilirsiniz:

Command="SystemCommands.MinimizeWindowCommand"

Bence bu tercih edilen yol olmalı ...


Simge durumuna küçült! = Uygulamadan çık. Bu listede bir çıkış uygulaması seçeneği görmüyorum. Daha fazla pencere yönetimi gibi görünüyor ve pencereyi kapat uygulaması mutlaka uygulamayı kapat anlamına gelmez. msdn.microsoft.com/en-us/library/…
kenny
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.