Uygulama Yönetimine Genel Bakış
Tüm uygulamalar, uygulama uygulama ve yönetimi için geçerli olan ortak bir işlev kümesini paylaşma eğilimindedir. Bu konu, uygulama oluşturma ve yönetmeye yönelik sınıftaki Application işlevlere genel bir bakış sağlar.
Uygulama Sınıfı
WPF'de, yaygın uygulama kapsamlı işlevsellik sınıfında kapsüllenmiş Application . Application sınıfı aşağıdaki işlevleri içerir:
Uygulama ömrünü izleme ve uygulama ömrüyle etkileşim kurma.
Komut satırı parametrelerini alma ve işleme.
İşlenmeyen özel durumları algılama ve yanıtlama.
Uygulama kapsamı özelliklerini ve kaynaklarını paylaşma.
Tek başına uygulamalarda pencereleri yönetme.
Gezintiyi izleme ve yönetme.
Uygulama Sınıfını Kullanarak Ortak Görevleri Gerçekleştirme
Sınıfın tüm ayrıntılarıyla Application ilgilenmiyorsanız, aşağıdaki tabloda bazı ortak görevler Application ve bunların nasıl yerine getirilmediği listelenmiştir. İlgili API'yi ve konuları görüntüleyerek daha fazla bilgi ve örnek kod bulabilirsiniz.
Görev | Yaklaşım |
---|---|
Geçerli uygulamayı temsil eden bir nesne alma | Application.Current özelliğini kullanın. |
Uygulamaya başlangıç ekranı ekleme | Bkz. WPF Uygulamasına Giriş Ekranı Ekleme. |
Uygulama başlatma | Application.Run yöntemini kullanın. |
Uygulamayı durdurma | nesnesinin ShutdownApplication.Current yöntemini kullanın. |
Komut satırından bağımsız değişkenleri alma | Olayı işleyip Application.Startup özelliğini kullanın StartupEventArgs.Args . Bir örnek için olaya bakın Application.Startup . |
Uygulama çıkış kodunu alma ve ayarlama | ExitEventArgs.ApplicationExitCode Olay işleyicisinde Application.Exit özelliğini ayarlayın veya yöntemini çağırın Shutdown ve bir tamsayı geçirin. |
İşlenmeyen özel durumları algılama ve yanıtlama | Olayı işleyebilir DispatcherUnhandledException . |
Uygulama kapsamlı kaynakları alma ve ayarlama | Application.Resources özelliğini kullanın. |
Uygulama kapsamı kaynak sözlüğü kullanma | Bkz. Uygulama Kapsamı Kaynak Sözlüğü Kullanma. |
Uygulama kapsamlı özellikleri alma ve ayarlama | Application.Properties özelliğini kullanın. |
Uygulamanın durumunu alma ve kaydetme | Bkz. Uygulama Oturumları Arasında Uygulama Kapsamı Özelliklerini Kalıcı Hale Getir ve Geri Yükle. |
Kaynak dosyaları, içerik dosyaları ve kaynak site dosyaları dahil olmak üzere kod dışı veri dosyalarını yönetin. | Bkz. WPF Uygulama Kaynağı, İçeriği ve Veri Dosyaları. |
Tek başına uygulamalarda pencereleri yönetme | Bkz. WPF Windows'a Genel Bakış. |
Gezintiyi izleme ve yönetme | Bkz. Gezintiye Genel Bakış. |
Uygulama Tanımı
sınıfının işlevselliğini Application kullanmak için bir uygulama tanımı uygulamanız gerekir. WPF uygulama tanımı, öğesinden Application türetilen ve özel bir MSBuild ayarıyla yapılandırılan bir sınıftır.
Uygulama Tanımı Uygulama
Tipik bir WPF uygulama tanımı hem işaretleme hem de arka planda kod kullanılarak uygulanır. Bu, olayları işlerken ve arka planda uygulamaya özgü davranışı uygularken uygulama özelliklerini, kaynaklarını ve olaylarını bildirim temelli olarak ayarlamak için işaretlemeyi kullanmanıza olanak tanır.
Aşağıdaki örnekte, hem işaretleme hem de arka planda kod kullanarak uygulama tanımının nasıl uygulandığı gösterilmektedir:
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App" />
using System.Windows;
namespace SDKSample
{
public partial class App : Application { }
}
Imports System.Windows
Namespace SDKSample
Partial Public Class App
Inherits Application
End Class
End Namespace
Bir işaretleme dosyası ve arka planda kod dosyasının birlikte çalışmasına izin vermek için aşağıdakilerin gerçekleşmesi gerekir:
İşaretlemede
Application
öğesininx:Class
özniteliğini içermesi gerekir. Uygulama oluşturulduğunda, işaretleme dosyasındaki varlığıx:Class
MSBuild'in özniteliği tarafından belirtilen adlı ve türetilen Application birpartial
sınıf oluşturmasınax:Class
neden olur. Bunun için, XAML şeması (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
) ile ilgili bir XML ad alanı bildirimi eklenmesi gerekir.Arka planda kodda sınıfı, işaretlemede özniteliği tarafından
x:Class
belirtilen aynı ada sahip birpartial
sınıf olmalıdır ve öğesinden Applicationtüretilmelidir. Bu, arka planda kod dosyasının uygulama oluşturulduğunda işaretleme dosyası için oluşturulan sınıflapartial
ilişkilendirilmesine olanak tanır (bkz . WPF Uygulaması Oluşturma).
Not
Visual Studio kullanarak yeni bir WPF Uygulaması projesi veya WPF Browser Uygulaması projesi oluşturduğunuzda, varsayılan olarak bir uygulama tanımı eklenir ve hem işaretleme hem de arka planda kod kullanılarak tanımlanır.
Bu kod, bir uygulama tanımını uygulamak için gereken en düşük koddur. Ancak, uygulamayı derlemeden ve çalıştırmadan önce uygulama tanımına ek bir MSBuild yapılandırması yapılması gerekir.
MSBuild için Uygulama Tanımını Yapılandırma
Tek başına uygulamalar ve XAML tarayıcı uygulamaları (XBAP'ler) çalıştırılabilmesi için belirli bir altyapı düzeyinin uygulanmasını gerektirir. Bu altyapının en önemli kısmı giriş noktasıdır. Bir uygulama bir kullanıcı tarafından başlatıldığında, işletim sistemi uygulamaları başlatmak için iyi bilinen bir işlev olan giriş noktasını çağırır.
Uyarı
XBAP'ler, Internet Explorer ve Firefox gibi eski tarayıcıların çalıştırılmasını gerektirir. Bu eski tarayıcı sürümleri genellikle Windows 10 ve Windows 11'de desteklenmez. Modern tarayıcılar artık güvenlik riskleri nedeniyle XBAP uygulamaları için gereken teknolojiyi desteklemiyor. XBAP'leri etkinleştiren eklentiler artık desteklenmemektedir.
Geleneksel olarak, geliştiricilerin teknolojiye bağlı olarak bu kodun bir kısmını veya tamamını kendileri için yazmaları gerekiyordu. Ancak WPF, aşağıdaki MSBuild proje dosyasında gösterildiği gibi uygulama tanımınızın işaretleme dosyası bir MSBuild ApplicationDefinition
öğesi olarak yapılandırıldığında sizin için bu kodu oluşturur:
<Project
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<ApplicationDefinition Include="App.xaml" />
<Compile Include="App.xaml.cs" />
...
</Project>
Arka planda kod dosyası kod içerdiğinden, normal olduğu gibi bir MSBuild Compile
öğesi olarak işaretlenir.
Bu MSBuild yapılandırmalarının bir uygulama tanımının işaretleme ve arka planda kod dosyalarına uygulanması, MSBuild'in aşağıdaki gibi kod oluşturmasına neden olur:
using System;
using System.Windows;
namespace SDKSample
{
public class App : Application
{
public App() { }
[STAThread]
public static void Main()
{
// Create new instance of application subclass
App app = new App();
// Code to register events and set properties that were
// defined in XAML in the application definition
app.InitializeComponent();
// Start running the application
app.Run();
}
public void InitializeComponent()
{
// Initialization code goes here.
}
}
}
Imports System.Windows
Namespace SDKSample
Public Class App
Inherits Application
Public Sub New()
End Sub
<STAThread>
Public Shared Sub Main()
' Create new instance of application subclass
Dim app As New App()
' Code to register events and set properties that were
' defined in XAML in the application definition
app.InitializeComponent()
' Start running the application
app.Run()
End Sub
Public Sub InitializeComponent()
' Initialization code goes here.
End Sub
End Class
End Namespace
Sonuçta elde edilen kod, uygulama tanımınızı giriş noktası yöntemini Main
içeren ek altyapı koduyla genişletiyor. STAThreadAttribute özniteliği, WPF uygulaması için ana UI iş parçacığının WPF uygulamaları için gerekli olan bir STA iş parçacığı olduğunu belirtmek için yöntemine uygulanırMain
. Çağrıldığında, Main
olayları kaydetmek ve işaretlemede uygulanan özellikleri ayarlamak için yöntemini çağırmadan InitializeComponent
önce yeni bir örneği App
oluşturur. InitializeComponent
Sizin için oluşturulduğundan ve uygulamaları için PageWindow yaptığınız gibi bir uygulama tanımından açıkça çağrı InitializeComponent
yapmanız gerekmez. Son olarak, Run uygulamayı başlatmak için yöntemi çağrılır.
Geçerli Uygulamayı Alma
sınıfının işlevselliği bir uygulama arasında paylaşıldığındanApplication, her biri için AppDomainsınıfının yalnızca bir örneği Application olabilir. Bunu zorunlu kılmak için, Application sınıfı tek bir sınıf olarak uygulanır (bkz . C#'de Singleton'ı Uygulama), tek bir örneğini oluşturur ve özelliğiyle static
Current bu sınıfa paylaşılan erişim sağlar.
Aşağıdaki kod, geçerli AppDomainiçin nesnesine Application başvuru alma işlemini gösterir.
// Get current application
Application current = App.Current;
' Get current application
Dim current As Application = App.Current
Current sınıfının bir örneğine Application başvuru döndürür. Türetilmiş sınıfınıza Application bir başvuru istiyorsanız, aşağıdaki örnekte gösterildiği gibi özelliğinin Current değerini atamanız gerekir.
// Get strongly-typed current application
App app = (App)App.Current;
' Get strongly-typed current application
Dim appCurrent As App = CType(App.Current, App)
değerini Current bir nesnenin yaşam süresi içinde herhangi bir Application noktada inceleyebilirsiniz. Ancak dikkatli olmalısınız. Sınıfın Application örneği oluşturulurken, nesnenin durumunun Application tutarsız olduğu bir dönem vardır. Bu süre boyunca, uygulamanızın altyapısını oluşturma, Application özellikleri ayarlama ve olayları kaydetme dahil olmak üzere kodunuzun çalışması için gereken çeşitli başlatma görevlerini gerçekleştirir. Bu süre boyunca nesnesini kullanmayı Application denerseniz, özellikle ayarlanan çeşitli Application özelliklere bağlıysa kodunuz beklenmeyen sonuçlara neden olabilir.
Başlatma çalışmalarını tamamladığında Application , yaşam süresi gerçekten başlar.
Uygulama Ömrü
Bir WPF uygulamasının ömrü, uygulamanızın ne zaman başlatıldığını, etkinleştirildiğini ve devre dışı bırakıldığını ve kapatıldığını size bildirmek için tarafından tetiklenen birkaç olayla Application işaretlenir.
Giriş Ekranı
.NET Framework 3.5 SP1'den başlayarak, başlangıç penceresinde veya giriş ekranında kullanılacak bir görüntü belirtebilirsiniz. sınıfı, SplashScreen uygulamanız yüklenirken başlangıç penceresinin görüntülenmesini kolaylaştırır. Pencere SplashScreen oluşturulur ve çağrılmadan önce Run gösterilir. Daha fazla bilgi için bkz . Uygulama Başlangıç Zamanı ve WPF Uygulamasına Giriş Ekranı Ekleme.
Uygulama Başlatma
Çağrıldıktan ve uygulama başlatıldıktan sonra Run , uygulama çalışmaya hazırdır. Olay tetiklendiğinde Startup bu an işaret edilir:
using System.Windows;
namespace SDKSample
{
public partial class App : Application
{
void App_Startup(object sender, StartupEventArgs e)
{
// Application is running
}
}
}
Namespace SDKSample
Partial Public Class App
Inherits Application
Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
' Application is running
'</SnippetStartupCODEBEHIND1>
End Class
End Namespace
'</SnippetStartupCODEBEHIND2>
Bir uygulamanın kullanım ömrü boyunca bu noktada yapılması gereken en yaygın şey kullanıcı arabirimini göstermektir.
Kullanıcı ArabirimiNi Gösterme
Tek başına Windows uygulamalarının çoğu, çalışmaya başladığında bir'i Window açar. Olay Startup işleyicisi, aşağıdaki kodda gösterildiği gibi bunu yapabileceğiniz bir konumdur.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App"
Startup="App_Startup" />
using System.Windows;
namespace SDKSample
{
public partial class App : Application
{
void App_Startup(object sender, StartupEventArgs e)
{
// Open a window
MainWindow window = new MainWindow();
window.Show();
}
}
}
Imports System.Windows
Namespace SDKSample
Partial Public Class App
Inherits Application
Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
' Open a window
Dim window As New MainWindow()
window.Show()
End Sub
End Class
End Namespace
Not
Tek başına bir uygulamada ilk Window örneği oluşturulacak olan, varsayılan olarak ana uygulama penceresi olur. Bu Window nesneye özelliği tarafından başvurulur Application.MainWindow . İlk örneklenden MainWindowWindow farklı bir pencere ana pencere olması gerekiyorsa, özelliğin değeri program aracılığıyla değiştirilebilir.
XBAP ilk başlatıldığında büyük olasılıkla bir Pageöğesine gider. Bu, aşağıdaki kodda gösterilmiştir.
<Application
x:Class="SDKSample.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Startup="App_Startup" />
using System;
using System.Windows;
using System.Windows.Navigation;
namespace SDKSample
{
public partial class App : Application
{
void App_Startup(object sender, StartupEventArgs e)
{
((NavigationWindow)this.MainWindow).Navigate(new Uri("HomePage.xaml", UriKind.Relative));
}
}
}
Imports System.Windows
Imports System.Windows.Navigation
Namespace SDKSample
Partial Public Class App
Inherits Application
Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
CType(Me.MainWindow, NavigationWindow).Navigate(New Uri("HomePage.xaml", UriKind.Relative))
End Sub
End Class
End Namespace
yalnızca bir Window öğesini açmak veya öğesine gitmek için PageişlersenizStartup, bunun yerine özniteliğini işaretlemede ayarlayabilirsinizStartupUri
.
Aşağıdaki örnekte, tek başına bir uygulamadan uygulamasının bir uygulamasını açmak için nasıl kullanılacağı StartupUri gösterilmektedir Window.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="MainWindow.xaml" />
Aşağıdaki örnekte, bir XBAP'ten bir öğesine gitmek için nasıl kullanılacağı StartupUri gösterilmektedir Page.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml" />
Bu işaretleme, bir pencereyi açmak için önceki kodla aynı etkiye sahiptir.
Not
Gezinti hakkında daha fazla bilgi için bkz . Gezintiye Genel Bakış.
Parametresiz bir Window oluşturucu kullanarak örneği oluşturmanız gerekiyorsa veya göstermeden önce özelliklerini ayarlamanız ya da olaylarına abone olmanız veya uygulama başlatıldığında sağlanan komut satırı bağımsız değişkenlerini işlemeniz gerekiyorsa, olayı açmak için olayı işlemeniz Startup gerekir.
Komut Satırı Bağımsız Değişkenlerini İşleme
Windows'ta tek başına uygulamalar bir komut isteminden veya masaüstünden başlatılabilir. Her iki durumda da, komut satırı bağımsız değişkenleri uygulamaya geçirilebilir. Aşağıdaki örnekte, "/StartMinimized" adlı tek bir komut satırı bağımsız değişkeniyle başlatılan bir uygulama gösterilmektedir:
wpfapplication.exe /StartMinimized
Uygulama başlatma sırasında WPF, işletim sisteminden komut satırı bağımsız değişkenlerini alır ve parametrenin özelliği aracılığıyla Args bunları Startup olay işleyicisine StartupEventArgs geçirir. Aşağıdaki gibi bir kod kullanarak komut satırı bağımsız değişkenlerini alabilir ve depolayabilirsiniz.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App"
Startup="App_Startup" />
using System.Windows;
namespace SDKSample
{
public partial class App : Application
{
void App_Startup(object sender, StartupEventArgs e)
{
// Application is running
// Process command line args
bool startMinimized = false;
for (int i = 0; i != e.Args.Length; ++i)
{
if (e.Args[i] == "/StartMinimized")
{
startMinimized = true;
}
}
// Create main application window, starting minimized if specified
MainWindow mainWindow = new MainWindow();
if (startMinimized)
{
mainWindow.WindowState = WindowState.Minimized;
}
mainWindow.Show();
}
}
}
Imports System.Windows
Namespace SDKSample
Partial Public Class App
Inherits Application
Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
' Application is running
' Process command line args
Dim startMinimized As Boolean = False
Dim i As Integer = 0
Do While i <> e.Args.Length
If e.Args(i) = "/StartMinimized" Then
startMinimized = True
End If
i += 1
Loop
' Create main application window, starting minimized if specified
Dim mainWindow As New MainWindow()
If startMinimized Then
mainWindow.WindowState = WindowState.Minimized
End If
mainWindow.Show()
End Sub
End Class
End Namespace
Kod, /StartMinimized komut satırı bağımsız değişkeninin sağlanıp sağlanmadığını denetlemek için işlerStartup; sağlandıysa, ile ana pencereyi WindowStateMinimizedaçar. Özelliğin WindowState program aracılığıyla ayarlanması gerektiğinden, main Window öğesinin kodda açıkça açılması gerektiğini unutmayın.
ClickOnce dağıtımı kullanılarak başlatıldıklarından XBAP'ler komut satırı bağımsız değişkenlerini alamaz ve işleyemez (bkz . WPF Uygulaması Dağıtma). Ancak, sorgu dizesi parametrelerini başlatmak için kullanılan URL'lerden alabilir ve işleyebilirler.
Uygulama Etkinleştirme ve Devre Dışı Bırakma
Windows, kullanıcıların uygulamalar arasında geçiş yapmasına olanak tanır. En yaygın yol, ALT+SEKME tuş bileşimini kullanmaktır. Bir uygulamaya yalnızca kullanıcının seçebileceği görünür Window bir uygulama varsa geçiş yapılabilir. Şu anda seçili Window olan pencere etkin penceredir (ön plan penceresi olarak da bilinir) ve kullanıcı girişi alan penceredirWindow. Etkin penceresi olan uygulama, etkin uygulamadır (veya ön plan uygulamasıdır). Bir uygulama aşağıdaki durumlarda etkin uygulama olur:
Başlatılır ve bir Windowgösterir.
Kullanıcı, uygulamada bir seçerek başka bir Window uygulamadan geçiş yapar.
Olayı işleyerek Application.Activated bir uygulamanın ne zaman etkin olduğunu algılayabilirsiniz.
Benzer şekilde, bir uygulama aşağıdaki durumlarda devre dışı olabilir:
Kullanıcı geçerli uygulamadan başka bir uygulamaya geçer.
Uygulama kapatıldığında.
Olayı işleyerek Application.Deactivated bir uygulamanın etkin olmadığı zamanları algılayabilirsiniz.
Aşağıdaki kod, bir uygulamanın etkin olup olmadığını belirlemek için ve Deactivated olaylarının nasıl işleneceğini Activated gösterir.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App"
StartupUri="MainWindow.xaml"
Activated="App_Activated"
Deactivated="App_Deactivated" />
using System;
using System.Windows;
namespace SDKSample
{
public partial class App : Application
{
bool isApplicationActive;
void App_Activated(object sender, EventArgs e)
{
// Application activated
this.isApplicationActive = true;
}
void App_Deactivated(object sender, EventArgs e)
{
// Application deactivated
this.isApplicationActive = false;
}
}
}
Imports System.Windows
Namespace SDKSample
Partial Public Class App
Inherits Application
Private isApplicationActive As Boolean
Private Sub App_Activated(ByVal sender As Object, ByVal e As EventArgs)
' Application activated
Me.isApplicationActive = True
End Sub
Private Sub App_Deactivated(ByVal sender As Object, ByVal e As EventArgs)
' Application deactivated
Me.isApplicationActive = False
End Sub
End Class
End Namespace
A Window da etkinleştirilebilir ve devre dışı bırakılabilir. Window.Deactivated Daha fazla bilgi için ve bölümüne bakınWindow.Activated.
Not
Application.Activated XBAP'ler için ne oluşturulur ne de Application.Deactivated oluşturulur.
Uygulama Kapatma
Bir uygulamanın ömrü kapatıldığında sona erer ve bu durum aşağıdaki nedenlerle oluşabilir:
Bir kullanıcı her Windowöğesini kapatır.
Kullanıcı ana Windowöğesini kapatır.
Kullanıcı oturumu kapatarak veya kapatarak Windows oturumunu sonlandırır.
Uygulamaya özgü bir koşul karşılandı.
Uygulama kapatmayı Application yönetmenize yardımcı olmak için yöntemini, ShutdownMode özelliğini ve ve Exit olaylarını SessionEnding sağlarShutdown.
Not
Shutdown yalnızca içeren UIPermissionuygulamalardan çağrılabilir. Tek başına WPF uygulamaları her zaman bu izne sahiptir. Ancak, İnternet bölgesinde çalışan XBAP'ler kısmi güven güvenlik korumalı alanında çalışmaz.
Kapatma Modu
Çoğu uygulama, tüm pencereler kapatıldığında veya ana pencere kapatıldığında kapanır. Ancak bazen uygulamaya özgü diğer koşullar bir uygulamanın ne zaman kapanacağını belirleyebilir. Aşağıdaki ShutdownMode numaralandırma değerlerinden biriyle ayarlayarak ShutdownMode uygulamanızın hangi koşullar altında kapatılacağını belirtebilirsiniz:
varsayılan değeri ShutdownMode olan değeri, OnLastWindowCloseuygulamadaki son pencere kullanıcı tarafından kapatıldığında uygulamanın otomatik olarak kapatıldığı anlamına gelir. Ancak, ana pencere kapatıldığında uygulamanızın kapatılması gerekiyorsa, wpf olarak ayarlarsanız ShutdownModeOnMainWindowClosebunu otomatik olarak yapar. Bu, aşağıdaki örnekte gösterilir.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App"
ShutdownMode="OnMainWindowClose" />
Uygulamaya özgü kapatma koşullarınız olduğunda olarak ayarlanır ShutdownModeOnExplicitShutdown. Bu durumda, yöntemi açıkça çağırarak Shutdown bir uygulamayı kapatmak sizin sorumluluğunuzdadır; aksi takdirde, tüm pencereler kapatılmış olsa bile uygulamanız çalışmaya devam eder. veya OnMainWindowCloseolduğunda ShutdownModeOnLastWindowClose örtük olarak çağrıldığını Shutdown unutmayın.
Not
ShutdownMode bir XBAP'den ayarlanabilir, ancak yoksayılır; bir XBAP, bir tarayıcıda veya XBAP'yi barındıran tarayıcı kapatıldığında her zaman kapatılır. Daha fazla bilgi için bkz . Gezintiye Genel Bakış.
Oturum Bitişi
özelliği tarafından ShutdownMode açıklanan kapatma koşulları bir uygulamaya özeldir. Ancak bazı durumlarda, bir uygulama bir dış koşulun sonucu olarak kapanabilir. En yaygın dış koşul, bir kullanıcı Windows oturumunu aşağıdaki eylemlerle sonlandırdığında oluşur:
Oturumu kapatma
Kapatma
Yeni -den başlatma
Hazırda Bekletme
Bir Windows oturumunun SessionEnding ne zaman bittiğini algılamak için, aşağıdaki örnekte gösterildiği gibi olayı işleyebilirsiniz.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App"
StartupUri="MainWindow.xaml"
SessionEnding="App_SessionEnding" />
using System.Windows;
namespace SDKSample
{
public partial class App : Application
{
void App_SessionEnding(object sender, SessionEndingCancelEventArgs e)
{
// Ask the user if they want to allow the session to end
string msg = string.Format("{0}. End session?", e.ReasonSessionEnding);
MessageBoxResult result = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo);
// End session, if specified
if (result == MessageBoxResult.No)
{
e.Cancel = true;
}
}
}
}
Imports System.Windows
Namespace SDKSample
Partial Public Class App
Inherits Application
Private Sub App_SessionEnding(ByVal sender As Object, ByVal e As SessionEndingCancelEventArgs)
' Ask the user if they want to allow the session to end
Dim msg As String = String.Format("{0}. End session?", e.ReasonSessionEnding)
Dim result As MessageBoxResult = MessageBox.Show(msg, "Session Ending", MessageBoxButton.YesNo)
' End session, if specified
If result = MessageBoxResult.No Then
e.Cancel = True
End If
End Sub
End Class
End Namespace
Bu örnekte kod, Windows oturumunun ReasonSessionEnding nasıl sona erdiğini belirlemek için özelliğini inceler. Kullanıcıya bir onay iletisi görüntülemek için bu değeri kullanır. Kullanıcı oturumun bitmesini istemiyorsa, kod Windows oturumunun sona ermesini engelleyecek şekilde true
ayarlarCancel.
Not
SessionEnding XBAP'ler için tetiklenmez.
Çıkış
Bir uygulama kapatıldığında, kalıcı uygulama durumu gibi bazı son işlemleri gerçekleştirmesi gerekebilir. Bu durumlarda, olay işleyicisinin Exit aşağıdaki örnekte yaptığı gibi App_Exit
olayı işleyebilirsiniz. App.xaml dosyasında bir olay işleyicisi olarak tanımlanır. Uygulama, App.xaml.cs ve Application.xaml.vb dosyalarında vurgulanır.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App"
StartupUri="MainWindow.xaml"
Startup="App_Startup"
Exit="App_Exit">
<Application.Resources>
<SolidColorBrush x:Key="ApplicationScopeResource" Color="White"></SolidColorBrush>
</Application.Resources>
</Application>
using System.Windows;
using System.IO;
using System.IO.IsolatedStorage;
namespace SDKSample
{
public partial class App : Application
{
string filename = "App.txt";
public App()
{
// Initialize application-scope property
this.Properties["NumberOfAppSessions"] = 0;
}
private void App_Startup(object sender, StartupEventArgs e)
{
// Restore application-scope property from isolated storage
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();
try
{
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filename, FileMode.Open, storage))
using (StreamReader reader = new StreamReader(stream))
{
// Restore each application-scope property individually
while (!reader.EndOfStream)
{
string[] keyValue = reader.ReadLine().Split(new char[] {','});
this.Properties[keyValue[0]] = keyValue[1];
}
}
}
catch (FileNotFoundException ex)
{
// Handle when file is not found in isolated storage:
// * When the first application session
// * When file has been deleted
}
}
private void App_Exit(object sender, ExitEventArgs e)
{
// Persist application-scope property to isolated storage
IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();
using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(filename, FileMode.Create, storage))
using (StreamWriter writer = new StreamWriter(stream))
{
// Persist each application-scope property individually
foreach (string key in this.Properties.Keys)
{
writer.WriteLine("{0},{1}", key, this.Properties[key]);
}
}
}
}
}
Imports System.IO
Imports System.IO.IsolatedStorage
Namespace SDKSample
Partial Public Class App
Inherits Application
Private filename As String = "App.txt"
Public Sub New()
' Initialize application-scope property
Me.Properties("NumberOfAppSessions") = 0
End Sub
Private Sub App_Startup(ByVal sender As Object, ByVal e As StartupEventArgs)
' Restore application-scope property from isolated storage
Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForDomain()
Try
Using stream As New IsolatedStorageFileStream(filename, FileMode.Open, storage)
Using reader As New StreamReader(stream)
' Restore each application-scope property individually
Do While Not reader.EndOfStream
Dim keyValue() As String = reader.ReadLine().Split(New Char() {","c})
Me.Properties(keyValue(0)) = keyValue(1)
Loop
End Using
End Using
Catch ex As FileNotFoundException
' Handle when file is not found in isolated storage:
' * When the first application session
' * When file has been deleted
End Try
End Sub
Private Sub App_Exit(ByVal sender As Object, ByVal e As ExitEventArgs)
' Persist application-scope property to isolated storage
Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForDomain()
Using stream As New IsolatedStorageFileStream(filename, FileMode.Create, storage)
Using writer As New StreamWriter(stream)
' Persist each application-scope property individually
For Each key As String In Me.Properties.Keys
writer.WriteLine("{0},{1}", key, Me.Properties(key))
Next key
End Using
End Using
End Sub
End Class
End Namespace
Tam örnek için bkz . Uygulama Oturumları Arasında Uygulama Kapsamı Özelliklerini Kalıcı Hale Getir ve Geri Yükle.
Exit hem tek başına uygulamalar hem de XBAP'ler tarafından işlenebilir. XBAP'ler için aşağıdaki Exit durumlarda tetiklenir:
Bir XBAP'den uzaklaşılır.
Internet Explorer'da, XBAP'yi barındıran sekme kapatıldığında.
Tarayıcı kapatıldığında.
Çıkış Kodu
Uygulamalar çoğunlukla bir kullanıcı isteğine yanıt olarak işletim sistemi tarafından başlatılır. Ancak, belirli bir görevi gerçekleştirmek için bir uygulama başka bir uygulama tarafından başlatılabilir. Başlatılan uygulama kapatıldığında, başlatan uygulama başlatılan uygulamanın hangi koşulda kapanacağını bilmek isteyebilir. Bu gibi durumlarda, Windows uygulamaların kapatma işleminde bir uygulama çıkış kodu döndürmesine izin verir. Varsayılan olarak, WPF uygulamaları 0 çıkış kodu değerini döndürür.
Not
Visual Studio'dan hata ayıkladığınızda, uygulama kapatıldığında çıkış penceresinde uygulama çıkış kodu aşağıdakine benzer bir iletide görüntülenir:
The program '[5340] AWPFApp.vshost.exe: Managed' has exited with code 0 (0x0).
Görünüm menüsünde Çıkış'a tıklayarak Çıkış penceresini açarsınız.
Çıkış kodunu değiştirmek için, çıkış kodu olarak bir tamsayı bağımsız değişkenini kabul eden aşırı yüklemeyi çağırabilirsiniz Shutdown(Int32) :
// Shutdown and return a non-default exit code
Application.Current.Shutdown(-1);
' Shutdown and return a non-default exit code
Application.Current.Shutdown(-1)
Olayı işleyerek Exit çıkış kodunun değerini algılayabilir ve değiştirebilirsiniz. Olay Exit işleyicisi, özelliğiyle ApplicationExitCode çıkış koduna erişim sağlayan bir ExitEventArgs geçirilir. Daha fazla bilgi için bkz. Exit.
Not
Çıkış kodunu hem tek başına uygulamalarda hem de XBAP'lerde ayarlayabilirsiniz. Ancak, çıkış kodu değeri XBAP'ler için yoksayılır.
İşlenmeyen Özel Durumlar
Bazen bir uygulama beklenmedik bir özel durum oluştuğunda olduğu gibi anormal koşullar altında kapatılabilir. Bu durumda, uygulama özel durumu algılamak ve işlemek için koda sahip olmayabilir. Bu tür bir özel durum işlenmeyen bir özel durumdur; uygulama kapatılana kadar aşağıdaki şekilde gösterilene benzer bir bildirim görüntülenir.
Kullanıcı deneyimi açısından bakıldığında, bir uygulamanın aşağıdakilerden bazılarını veya tümünü yaparak bu varsayılan davranışı önlemesi daha iyidir:
Kullanıcı dostu bilgileri görüntüleme.
Bir uygulamayı çalışır durumda tutmaya çalışma.
Windows olay günlüğüne ayrıntılı, geliştirici dostu özel durum bilgilerini kaydetme.
Bu desteğin uygulanması, olayın tetiklendiği işlenmeyen özel durumları algılayabilmeye DispatcherUnhandledException bağlıdır.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App"
StartupUri="MainWindow.xaml"
DispatcherUnhandledException="App_DispatcherUnhandledException" />
using System.Windows;
using System.Windows.Threading;
namespace SDKSample
{
public partial class App : Application
{
void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
// Process unhandled exception
// Prevent default unhandled exception processing
e.Handled = true;
}
}
}
Imports System.Windows
Imports System.Windows.Threading
Namespace SDKSample
Partial Public Class App
Inherits Application
Private Sub App_DispatcherUnhandledException(ByVal sender As Object, ByVal e As DispatcherUnhandledExceptionEventArgs)
' Process unhandled exception
' Prevent default unhandled exception processing
e.Handled = True
End Sub
End Class
End Namespace
Olay DispatcherUnhandledException işleyicisi, özel durumun kendisi (DispatcherUnhandledExceptionEventArgs.Exception) dahil olmak üzere işlenmeyen özel durumla ilgili bağlamsal bilgileri içeren bir DispatcherUnhandledExceptionEventArgs parametre geçirilir. Özel durumun nasıl işleneceğini belirlemek için bu bilgileri kullanabilirsiniz.
öğesini işlerken DispatcherUnhandledExceptionözelliğini true
olarak ayarlamanız DispatcherUnhandledExceptionEventArgs.Handled gerekir; aksi takdirde WPF yine de özel durumu işlenmemiş olarak değerlendirir ve daha önce açıklanan varsayılan davranışa geri döner. İşlenmeyen bir özel durum oluşturulursa ve DispatcherUnhandledException olay işlenmezse veya olay işlenir ve Handled olarak false
ayarlanırsa, uygulama hemen kapanır. Ayrıca, başka Application hiçbir olay tetiklenir. Sonuç olarak, uygulamanız kapanmadan önce çalışması gereken bir koda sahipse işlemeniz DispatcherUnhandledException gerekir.
İşlenmeyen bir özel durum nedeniyle bir uygulama kapatılsa da, bir sonraki bölümde açıklandığı gibi bir uygulama genellikle kullanıcı isteğine yanıt olarak kapanır.
Uygulama Ömrü Olayları
Tek başına uygulamalar ve XBAP'ler tam olarak aynı yaşam süresine sahip değildir. Aşağıdaki şekilde, tek başına bir uygulamanın ömründeki önemli olaylar ve bunların oluşturulduğu sıra gösterilmektedir.
Benzer şekilde, aşağıdaki şekilde bir XBAP'ın ömründeki önemli olaylar gösterilir ve bunların oluşturulduğu sıra gösterilir.
Ayrıca bkz.
.NET Desktop feedback
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin