Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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, Application sınıfındaki uygulama oluşturma ve yönetme işlevlerine genel bir bakış sağlar.
Uygulama Sınıfı
WPF'de, uygulama kapsamlı yaygın işlevsellik Application sınıfında kapsüllenmiştir. 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ı parametreleri alınıyor ve işleniyor.
İşlenmeyen özel durumları algılama ve yanıtlama.
Uygulama kapsamı özelliklerini ve kaynaklarını paylaşma.
Tek başına uygulamalarda pencereleri yönetme.
Gezinmeyi takip etme ve yönetme.
Uygulama Sınıfını Kullanarak Ortak Görevleri Gerçekleştirme
Application sınıfının tüm ayrıntılarıyla ilgilenmiyorsanız, aşağıdaki tabloda Application için bazı yaygın görevler ve bunları nasıl gerçekleştirecekleri 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 | Bakınız WPF Uygulamasına Başlangıç Ekranı Ekleme. |
| Uygulama başlatma | Application.Run yöntemini kullanın. |
| Uygulamayı durdurma | Shutdown nesnesinin Application.Current yöntemini kullanın. |
| Komut satırından bağımsız değişkenleri alma | Application.Startup olayını işleyip StartupEventArgs.Args özelliğini kullanın. Bir örnek için Application.Startup olayına bakın. |
| Uygulama çıkış kodunu alma ve ayarlama | ExitEventArgs.ApplicationExitCode olay işleyicisinde Application.Exit özelliğini ayarlayın veya Shutdown yöntemini çağırın ve bir tamsayı geçirin. |
| İşlenmeyen özel durumları tespit etme ve yanıtlama | DispatcherUnhandledException olayını işle. |
| Uygulama kapsamlı kaynakları alma ve ayarlama | Application.Resources özelliğini kullanın. |
| Uygulama kapsamı kaynak sözlüğü kullanma | bkz. Application-Scope Kaynak Sözlüğü kullanma. |
| Uygulama kapsamındaki özellikleri alma ve ayarlama | Application.Properties özelliğini kullanın. |
| Uygulamanın durumunu alma ve kaydetme | Bkz. Uygulama Oturumlarında Application-Scope Ö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. Navigasyona Genel Bakış. |
Uygulama Tanımı
Application sınıfının işlevselliğinden yararlanmak için bir uygulama tanımı uygulamanız gerekir. WPF uygulama tanımı, Application türetilen ve özel bir MSBuild ayarıyla yapılandırılan bir sınıftır.
Uygulama Tanımının Uygulanması
Tipik bir WPF uygulama tanımı hem işaretleme hem de arka planda kod kullanılarak uygulanır. Bu, işaretleme dilini kullanarak uygulama özelliklerini, kaynaklarını ve olayları bildirimsellikle ayarlamanıza olanak tanırken, olayları işlerken ve arka plan kodunda uygulamaya özgü davranışları uygulamanızı sağlar.
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öğesix:Classözniteliğini içermelidir. Uygulama oluşturulduğunda, işaretleme dosyasındax:Classvarlığı, MSBuild'inpartial'den türetilen ve Application özniteliği tarafından belirtilen ada sahip birx:Classsınıfı oluşturmasına neden olur. Bunun için XAML şeması (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml") için bir XML ad alanı bildirimi eklenmesi gerekir.Kodun arka planında sınıf, işaretlemedeki
partialözniteliği tarafından belirtilen aynı ada sahip birx:Classsınıfı olmalı ve Application'den türetilmelidir. Bu, arka planda kod dosyasının, uygulama oluşturulduğunda işaretleme dosyası için oluşturulanpartialsınıfıyla ilişkilendirilmesine olanak tanır (bkz. WPF Uygulaması oluşturma).
Uyarı
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'un eski sürümleri gibi eski tarayıcıların çalıştırılmasını gerektirir. Bu eski tarayıcılar 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. Daha fazla bilgi için bkz. WPF tarayıcı tarafından barındırılan uygulamalar (XBAP)hakkında sık sorulan sorular.
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ı Maingiriş noktası yöntemini 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 üzere Main yöntemine uygulanır. çağrıldığında, Main olayları kaydetmek ve işaretlemede uygulanan özellikleri ayarlamak için App yöntemini çağırmadan önce yeni bir InitializeComponent örneği oluşturur.
InitializeComponent sizin için oluşturulduğundan, InitializeComponent ve Page uygulamaları için yaptığınız gibi bir uygulama tanımından Window açıkça çağırmanız gerekmez. Son olarak, uygulamayı başlatmak için Run yöntemi çağrılır.
Geçerli Uygulamayı Alma
Application sınıfının işlevselliği bir uygulama arasında paylaşıldığından, Applicationbaşına AppDomain sınıfının yalnızca bir örneği olabilir. Bunu zorlamak için, Application sınıfı singleton sınıf olarak tasarlanır (bkz. C#'de Singleton Uygulama), tek bir örneğini oluşturup staticCurrent özelliğiyle bu örneğe paylaşılan erişim sağlar.
Aşağıdaki kod, geçerli Applicationiçin AppDomain nesnesine başvuru alma işlemini gösterir.
// Get current application
Application current = App.Current;
' Get current application
Dim current As Application = App.Current
Current, Application sınıfının bir örneğine referans döndürür. türetilmiş Application sınıfınıza başvuru istiyorsanız, aşağıdaki örnekte gösterildiği gibi Current özelliğinin 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)
bir Current nesnesinin ömrü boyunca herhangi bir noktada Application değerini inceleyebilirsiniz. Ancak dikkatli olmalısınız. Application sınıfı örneklendirildikten sonra, Application nesnesinin durumunun tutarsız olduğu bir dönem vardır. Bu süre boyunca, Application uygulama altyapısı oluşturma, özellikleri ayarlama ve olayları kaydetme dahil olmak üzere kodunuzun çalışması için gereken çeşitli başlatma görevlerini gerçekleştirmektedir. Bu süre boyunca Application nesnesini kullanmaya çalışırsanız, özellikle ayarlanan çeşitli Application özelliklerine bağlıysa kodunuz beklenmeyen sonuçlar verebilir.
Application başlatma işlemlerini tamamladığında, yaşam süresi gerçek anlamda 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 Application tarafından tetiklenen birkaç olayla işaretlenir.
Giriş Ekranı
.NET Framework 3.5 SP1'den başlayarak, başlangıç penceresinde kullanılacak bir görüntü veya giriş ekranıbelirtebilirsiniz. SplashScreen sınıfı, uygulamanız yüklenirken başlangıç penceresi görüntülemeyi kolaylaştırır. SplashScreen penceresi oluşturulur ve Run çağrılmadan önce gösterilir. Daha fazla bilgi için bkz. Uygulama Başlangıç Zamanı ve WPF Uygulamasına Giriş Ekranı Ekleme.
Uygulama Başlatma
Run çağrıldıktan ve uygulama başlatıldıktan sonra, uygulama çalışmaya hazırdır. Startup olayı tetiklendiğinde 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
Çoğu bağımsız Windows uygulaması çalışmaya başladığında bir Window açar. Startup olay 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
Uyarı
Tek başına bir uygulamada ilk örneklenen Window varsayılan olarak ana uygulama penceresi olur. Bu Window nesnesine Application.MainWindow özelliği ile başvurulur. MainWindow özelliğinin değeri, ilk oluşturulan Window yerine farklı bir pencere ana pencere olacaksa programlı olarak değiştirilebilir.
Bir XBAP ilk başlatıldığında, büyük olasılıkla bir Page'a 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 Startup açmak veya bir Window'ye gitmek için Page'ı ele alıyorsanız, bunun yerine işaretlemede StartupUri özniteliğini ayarlayabilirsiniz.
Aşağıdaki örnek, bağımsız bir uygulamadan StartupUri kullanılarak nasıl Windowaçılacağını göstermektedir.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="MainWindow.xaml" />
Aşağıdaki örnekte, bir XBAP'den StartupUri kullanarak Page'e nasıl gidileceği gösterilmektedir.
<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.
Uyarı
Gezinti hakkında daha fazla bilgi için bkz. Gezintiye Genel Bakış.
Startup olayını, Window’i açmanız gerekiyorsa, parametresiz olmayan bir oluşturucu kullanarak örneğini oluşturmanız, veya özelliklerini ayarlamanız ya da göstermeden önce olaylarına abone olmanız ya da uygulama başlatıldığında sağlanan komut satırı argümanlarını işlemeniz gerekiyorsa ele almanız gerekir.
Command-Line Argümanlarını İş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 aktarılabilir. 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 Startup parametresinin Args özelliği aracılığıyla StartupEventArgs olay işleyicisine geçirir. Aşağıdaki gibi bir kod kullanarak komut satırı argümanlarını 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, Startup komut satırı bağımsız değişkeninin sağlanıp sağlanmadığını kontrol etmek için 'i işler; eğer sağlandıysa, WindowStateMinimized ile ana pencereyi açar. WindowState özelliğinin program aracılığıyla ayarlanması gerektiğinden, ana Window’in kodda açıkça açılması gerektiğini unutmayın.
XBAP'ler, ClickOnce dağıtımı kullanılarak başlatıldığı için komut satırı bağımsız değişkenlerini almak ve işlemek mümkün değildir (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 bir Window varsa geçiş yapılabilir. Seçili olan Window, etkin pencere (ön plan penceresiolarak da bilinir) ve kullanıcı girdisini alan Window'tir. Etkin penceresi olan uygulama, etkin uygulama (veya ön plan uygulaması). Bir uygulama aşağıdaki durumlarda etkin uygulama olur:
Başlatılır ve Window'ı gösterir.
Kullanıcı, uygulamada bir Window seçerek başka bir uygulamadan geçiş yapar.
Application.Activated olayını işleyerek 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.
Application.Deactivated olayını işleyerek bir uygulamanın etkin olmadığı zamanları algılayabilirsiniz.
Aşağıdaki kod, bir uygulamanın etkin olup olmadığını belirlemek için Activated ve Deactivated olaylarının nasıl işleneceğini 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
Bir Window da etkinleştirilebilir ve devre dışı bırakılabilir. Daha fazla bilgi için bkz. Window.Activated ve Window.Deactivated.
Uyarı
XBAP'ler için ne Application.Activated ne de Application.Deactivated tetiklenmez.
Uygulama Kapatma
Bir uygulamanın ömrü kapatıldığında sona erer ve bu durum aşağıdaki nedenlerle oluşabilir:
Kullanıcı her bir Window'i kapatır.
Kullanıcı ana Window'i kapatır.
Kullanıcı oturumu kapatarak veya bilgisayarı kapatarak Windows oturumunu sonlandırır.
Uygulamaya özgü bir koşul karşılandı.
Uygulama kapatmayı yönetmenize yardımcı olmak için ApplicationShutdown yöntemini, ShutdownMode özelliğini, SessionEnding ve Exit olaylarını sağlar.
Uyarı
Shutdown yalnızca UIPermissionolan uygulamalardan çağrılabilir. Tek başına WPF uygulamaları her zaman bu izne sahiptir. Ancak, İnternet bölgesinde kısmi güven güvenlik korumalı alanında çalışan XBAP'ler çalışmazlar.
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 ShutdownMode ayarlayarak uygulamanızın kapatılacağı koşulları belirtebilirsiniz:
ShutdownMode varsayılan değeri OnLastWindowClosedeğeridir. Bu, uygulamadaki 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, ShutdownModeOnMainWindowCloseolarak ayarlarsanız WPF bunu otomatik olarak yapar. Bu, aşağıdaki örnekte gösterilmiştir.
<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, ShutdownModeOnExplicitShutdownolarak ayarlarsınız. Bu durumda, Shutdown yöntemini açıkça çağırarak bir uygulamayı kapatmak sizin sorumluluğunuzdadır; aksi takdirde, tüm pencereler kapatıldığında bile uygulamanız çalışmaya devam eder. Shutdown ShutdownMode veya OnLastWindowCloseolduğunda OnMainWindowClose örtük olarak çağrıldığını unutmayın.
Uyarı
ShutdownMode bir XBAP'tan ayarlanabilir, ancak dikkate alınmaz; bir tarayıcıda sayfa değiştirildiğinde veya XBAP'yi barındıran tarayıcı kapatıldığında XBAP her zaman kapatılır. Daha fazla bilgi için bkz. Gezintiye Genel Bakış.
Oturum Bitişi
ShutdownMode özelliği tarafından 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
Yeniden başlatma
Uykuya Alma
Bir Windows oturumunun ne zaman bittiğini algılamak için, aşağıdaki örnekte gösterildiği gibi SessionEnding olayını 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 nasıl sona erdiğini belirlemek için ReasonSessionEnding ö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 önlemek için Canceltrue olarak ayarlar.
Uyarı
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, Exit olay işleyicisinin aşağıdaki örnekte yaptığı gibi App_Exit olayını işleyebilirsiniz.
App.xaml dosyasında 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ında Application-Scope Ö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 durumlar söz konusu olduğunda Exit yükseltilir.
Bir XBAP'den çıkış yapı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.
Uyarı
Visual Studio'dan hata ayıkladığınızda, uygulama kapatıldığında uygulama çıkış kodu Çıktı penceresinde 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ündeki Çıktı seçeneğine tıklayarak Çıktı penceresini açarsınız.
Çıkış kodunu değiştirmek için, çıkış kodu olarak bir tamsayı bağımsız değişkeni kabul eden Shutdown(Int32) aşırı yüklemesini çağırabilirsiniz.
// Shutdown and return a non-default exit code
Application.Current.Shutdown(-1);
' Shutdown and return a non-default exit code
Application.Current.Shutdown(-1)
çıkış kodunun değerini algılayabilir ve Exit olayını işleyerek değiştirebilirsiniz. Exit olay işleyicisine, ExitEventArgs özelliğiyle çıkış koduna erişim sağlayan bir ApplicationExitCode geçer. Daha fazla bilgi için bkz. Exit.
Uyarı
Çıkış kodunu hem tek başına uygulamalarda hem de XBAP'lerde ayarlayabilirsiniz. Ancak, çıkış kodu değeri XBAP'ler için göz ardı edilir.
İş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ı, DispatcherUnhandledException olayının neden olduğu işlenmeyen özel durumları algılayabilmeye 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
DispatcherUnhandledException olay işleyicisine, özel durumun kendisi (DispatcherUnhandledExceptionEventArgs) dahil işlenmeyen özel durumla ilgili bağlamsal bilgiler içeren bir DispatcherUnhandledExceptionEventArgs.Exception parametresi geçirilir. Özel durumun nasıl işleneceğini belirlemek için bu bilgileri kullanabilirsiniz.
DispatcherUnhandledExceptionişlerken DispatcherUnhandledExceptionEventArgs.Handled özelliğini trueolarak ayarlamanız gerekir; aksi takdirde WPF yine de özel durumun işlenmemiş olduğunu düşünür 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 Handledfalseolarak ayarlanırsa, uygulama hemen kapanır. Ayrıca, başka hiçbir Application olayı tetiklenmez. Sonuç olarak, uygulamanızın kapanmadan önce çalışması gereken kodu varsa DispatcherUnhandledException işlemeniz 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, bağımsız bir uygulamanın yaşam döngüsündeki ana olaylar ve bunların gerçekleştiği 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.
XBAP 
Ayrıca bakınız
- Application
- WPF Windows'a Genel Bakış
- Gezintiye Genel Bakış
- WPF Uygulama Kaynağı, İçeriği ve Veri Dosyaları
- WPF'te Paket URI'leri
- Uygulama Modeli: Nasıl Yapılır Konuları
- uygulama geliştirme
.NET Desktop feedback