Gambaran Umum Manajemen Aplikasi
Semua aplikasi cenderung berbagi serangkaian fungsionalitas umum yang berlaku untuk implementasi dan manajemen aplikasi. Topik ini memberikan gambaran umum tentang fungsionalitas di Application kelas untuk membuat dan mengelola aplikasi.
Kelas Aplikasi
Di WPF, fungsionalitas cakupan aplikasi umum dienkapsulasi di Application kelas . Kelas Application ini mencakup fungsionalitas berikut:
Melacak dan berinteraksi dengan masa pakai aplikasi.
Mengambil dan memproses parameter baris perintah.
Mendeteksi dan merespons pengecualian yang tidak tertangani.
Berbagi properti dan sumber daya cakupan aplikasi.
Mengelola windows dalam aplikasi mandiri.
Melacak dan mengelola navigasi.
Cara Melakukan Tugas Umum Menggunakan Kelas Aplikasi
Jika Anda tidak tertarik dengan semua detail Application kelas, tabel berikut mencantumkan beberapa tugas umum untuk Application dan cara menyelesaikannya. Dengan melihat API dan topik terkait, Anda dapat menemukan informasi lebih lanjut dan kode sampel.
Tugas | Pendekatan |
---|---|
Mendapatkan objek yang mewakili aplikasi saat ini | Gunakan properti Application.Current. |
Menambahkan layar startup ke aplikasi | Lihat Menambahkan Layar Splash ke Aplikasi WPF. |
Memulai aplikasi | Gunakan metode Application.Run. |
Menghentikan aplikasi | Shutdown Gunakan metode Application.Current objek. |
Mendapatkan argumen dari baris perintah | Application.Startup Tangani peristiwa dan gunakan StartupEventArgs.Args properti . Misalnya, lihat Application.Startup peristiwa. |
Mendapatkan dan mengatur kode keluar aplikasi | Atur ExitEventArgs.ApplicationExitCode Application.Exit properti di penanganan aktivitas atau panggil Shutdown metode dan teruskan bilangan bulat. |
Mendeteksi dan merespons pengecualian yang tidak tertangani | DispatcherUnhandledException Tangani peristiwa. |
Mendapatkan dan mengatur sumber daya cakupan aplikasi | Gunakan properti Application.Resources. |
Menggunakan kamus sumber daya cakupan aplikasi | Lihat Menggunakan Kamus Sumber Daya Cakupan Aplikasi. |
Mendapatkan dan mengatur properti cakupan aplikasi | Gunakan properti Application.Properties. |
Mendapatkan dan menyimpan status aplikasi | Lihat Mempertahankan dan Memulihkan Properti Cakupan Aplikasi di Seluruh Sesi Aplikasi. |
Mengelola file data non-kode, termasuk file sumber daya, file konten, dan file situs asal. | Lihat Sumber Daya Aplikasi, Konten, dan File Data WPF. |
Mengelola jendela dalam aplikasi mandiri | Lihat Gambaran Umum Windows WPF. |
Melacak dan mengelola navigasi | Lihat Gambaran Umum Navigasi. |
Definisi Aplikasi
Untuk menggunakan fungsionalitas Application kelas, Anda harus menerapkan definisi aplikasi. Definisi aplikasi WPF adalah kelas yang berasal dari Application dan dikonfigurasi dengan pengaturan MSBuild khusus.
Menerapkan Definisi Aplikasi
Definisi aplikasi WPF umum diimplementasikan menggunakan markup dan code-behind. Ini memungkinkan Anda menggunakan markup untuk secara deklaratif mengatur properti aplikasi, sumber daya, dan mendaftarkan peristiwa, sambil menangani peristiwa dan menerapkan perilaku khusus aplikasi di code-behind.
Contoh berikut menunjukkan cara menerapkan definisi aplikasi menggunakan markup dan code-behind:
<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
Untuk mengizinkan file markup dan file code-behind bekerja sama, hal berikut perlu terjadi:
Dalam markup, elemen
Application
harus menyertakan atributx:Class
. Ketika aplikasi dibuat, keberadaanx:Class
dalam file markup menyebabkan MSBuild membuatpartial
kelas yang berasal dari Application dan memiliki nama yang ditentukan olehx:Class
atribut . Hal ini memerlukan penambahan deklarasi namespace XML untuk skema XAML (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
).Dalam code-behind, kelas harus kelas
partial
dengan nama yang sama yang ditentukan olehx:Class
atribut dalam markup dan harus berasal dari Application. Ini memungkinkan file code-behind dikaitkan denganpartial
kelas yang dihasilkan untuk file markup saat aplikasi dibuat (lihat Membangun Aplikasi WPF).
Catatan
Saat Anda membuat proyek Aplikasi WPF baru atau proyek Aplikasi Browser WPF menggunakan Visual Studio, definisi aplikasi disertakan secara default dan didefinisikan menggunakan markup dan kode di belakang.
Kode ini adalah minimum yang diperlukan untuk menerapkan definisi aplikasi. Namun, konfigurasi MSBuild tambahan perlu dibuat ke definisi aplikasi sebelum membangun dan menjalankan aplikasi.
Mengonfigurasi Definisi Aplikasi untuk MSBuild
Aplikasi mandiri dan aplikasi browser XAML (XBAP) memerlukan implementasi tingkat infrastruktur tertentu sebelum dapat berjalan. Bagian terpenting dari infrastruktur ini adalah titik masuk. Ketika aplikasi diluncurkan oleh pengguna, sistem operasi memanggil titik masuk, yang merupakan fungsi terkenal untuk memulai aplikasi.
Peringatan
XBAP memerlukan browser warisan untuk beroperasi, seperti Internet Explorer dan firefox versi lama. Browser lama ini biasanya tidak didukung pada Windows 10 dan Windows 11. Browser modern tidak lagi mendukung teknologi yang diperlukan untuk aplikasi XBAP karena risiko keamanan. Plugin yang mengaktifkan XBAP tidak lagi didukung. Untuk informasi selengkapnya, lihat Tanya jawab umum tentang aplikasi yang dihosting browser WPF (XBAP).
Secara tradisional, pengembang harus menulis beberapa atau semua kode ini untuk diri mereka sendiri, tergantung pada teknologinya. Namun, WPF menghasilkan kode ini untuk Anda ketika file markup definisi aplikasi Anda dikonfigurasi sebagai item MSBuild ApplicationDefinition
, seperti yang ditunjukkan dalam file proyek MSBuild berikut:
<Project
DefaultTargets="Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<ApplicationDefinition Include="App.xaml" />
<Compile Include="App.xaml.cs" />
...
</Project>
Karena file code-behind berisi kode, file tersebut ditandai sebagai item MSBuild Compile
, seperti biasa.
Aplikasi konfigurasi MSBuild ini ke file markup dan code-behind dari definisi aplikasi menyebabkan MSBuild menghasilkan kode seperti berikut:
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
Kode yang dihasilkan menambah definisi aplikasi Anda dengan kode infrastruktur tambahan, yang mencakup metode Main
titik masuk . Atribut STAThreadAttribute diterapkan ke Main
metode untuk menunjukkan bahwa utas UI utama untuk aplikasi WPF adalah utas STA, yang diperlukan untuk aplikasi WPF. Saat dipanggil, Main
buat instans App
baru sebelum memanggil InitializeComponent
metode untuk mendaftarkan peristiwa dan mengatur properti yang diimplementasikan dalam markup. Karena InitializeComponent
dibuat untuk Anda, Anda tidak perlu secara eksplisit memanggil InitializeComponent
dari definisi aplikasi seperti yang Anda lakukan untuk Page dan Window implementasi. Akhirnya, Run metode ini dipanggil untuk memulai aplikasi.
Mendapatkan Aplikasi Saat Ini
Karena fungsionalitas Application kelas dibagikan di seluruh aplikasi, hanya ada satu instans Application kelas per AppDomain. Untuk menerapkan ini, Application kelas diimplementasikan sebagai kelas singleton (lihat Menerapkan Singleton di C#), yang membuat satu instans itu sendiri dan menyediakan akses bersama ke static
Current dalamnya dengan properti .
Kode berikut menunjukkan cara memperoleh referensi ke Application objek untuk saat ini AppDomain.
// Get current application
Application current = App.Current;
' Get current application
Dim current As Application = App.Current
Current mengembalikan referensi ke instans Application kelas. Jika Anda menginginkan referensi ke kelas turunan, Application Anda harus mentransmisikan nilai Current properti, seperti yang ditunjukkan dalam contoh berikut.
// Get strongly-typed current application
App app = (App)App.Current;
' Get strongly-typed current application
Dim appCurrent As App = CType(App.Current, App)
Anda dapat memeriksa nilai Current kapan saja dalam masa Application pakai objek. Namun, Anda harus berhati-hati. Application Setelah kelas dibuat, ada periode di mana status Application objek tidak konsisten. Selama periode ini, Application sedang melakukan berbagai tugas inisialisasi yang diperlukan oleh kode Anda untuk dijalankan, termasuk membuat infrastruktur aplikasi, mengatur properti, dan mendaftarkan peristiwa. Jika Anda mencoba menggunakan Application objek selama periode ini, kode Anda mungkin memiliki hasil yang tidak terduga, terutama jika bergantung pada berbagai Application properti yang diatur.
Ketika Application menyelesaikan pekerjaan inisialisasinya, masa pakainya benar-benar dimulai.
Masa Pakai Aplikasi
Masa pakai aplikasi WPF ditandai oleh beberapa peristiwa yang dinaikkan oleh Application untuk memberi tahu Anda ketika aplikasi Anda telah dimulai, telah diaktifkan dan dinonaktifkan, dan telah dimatikan.
Layar Percikan
Mulai dari .NET Framework 3.5 SP1, Anda dapat menentukan gambar yang akan digunakan di jendela startup, atau layar percikan. Kelas SplashScreen memudahkan untuk menampilkan jendela startup saat aplikasi Anda dimuat. Jendela SplashScreen dibuat dan ditampilkan sebelumnya Run dipanggil. Untuk informasi selengkapnya, lihat Waktu Startup Aplikasi dan Menambahkan Layar Splash ke Aplikasi WPF.
Memulai Aplikasi
Setelah Run dipanggil dan aplikasi diinisialisasi, aplikasi siap dijalankan. Momen ini ditandatangani ketika Startup acara dinaikkan:
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>
Pada titik ini dalam masa pakai aplikasi, hal paling umum yang harus dilakukan adalah menunjukkan UI.
Menampilkan Antarmuka Pengguna
Sebagian besar aplikasi Windows mandiri membuka Window ketika mereka mulai berjalan. Penanganan Startup aktivitas adalah salah satu lokasi tempat Anda dapat melakukan ini, seperti yang ditunjukkan oleh kode berikut.
<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
Catatan
Yang pertama Window dibuat dalam aplikasi mandiri menjadi jendela aplikasi utama secara default. Objek ini Window dirujuk oleh Application.MainWindow properti . Nilai MainWindow properti dapat diubah secara terprogram jika jendela yang berbeda dari jendela pertama yang dibuat Window harus menjadi jendela utama.
Ketika XBAP pertama kali dimulai, kemungkinan besar akan menavigasi ke Page. Hal ini ditunjukkan dalam segmen kode berikut.
<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
Jika Anda menangani Startup untuk hanya membuka Window atau menavigasi ke Page, Anda dapat mengatur StartupUri
atribut dalam markup sebagai gantinya.
Contoh berikut menunjukkan cara menggunakan StartupUri dari aplikasi mandiri untuk membuka Window.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="MainWindow.xaml" />
Contoh berikut menunjukkan cara menggunakan StartupUri dari XBAP untuk menavigasi ke Page.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml" />
Markup ini memiliki efek yang sama dengan kode sebelumnya untuk membuka jendela.
Catatan
Untuk informasi selengkapnya tentang navigasi, lihat Gambaran Umum Navigasi.
Anda perlu menangani Startup peristiwa untuk membuka Window jika Anda perlu membuat instansnya menggunakan konstruktor non-parameterless, atau Anda perlu mengatur propertinya atau berlangganan peristiwanya sebelum menampilkannya, atau Anda perlu memproses argumen baris perintah apa pun yang disediakan saat aplikasi diluncurkan.
Memproses Argumen Baris Perintah
Di Windows, aplikasi mandiri dapat diluncurkan dari prompt perintah atau desktop. Dalam kedua kasus, argumen baris perintah dapat diteruskan ke aplikasi. Contoh berikut menunjukkan aplikasi yang diluncurkan dengan argumen baris perintah tunggal, "/StartMinimized":
wpfapplication.exe /StartMinimized
Selama inisialisasi aplikasi, WPF mengambil argumen baris perintah dari sistem operasi dan meneruskannya ke Startup penanganan aktivitas melalui Args properti StartupEventArgs parameter. Anda dapat mengambil dan menyimpan argumen baris perintah menggunakan kode seperti berikut ini.
<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
Kode menangani Startup untuk memeriksa apakah argumen baris perintah /StartMinimized disediakan; jika demikian, kode akan membuka jendela utama dengan WindowState .Minimized Perhatikan bahwa karena WindowState properti harus diatur secara terprogram, yang utama Window harus dibuka secara eksplisit dalam kode.
XBAP tidak dapat mengambil dan memproses argumen baris perintah karena diluncurkan menggunakan penyebaran ClickOnce (lihat Menyebarkan Aplikasi WPF). Namun, mereka dapat mengambil dan memproses parameter string kueri dari URL yang digunakan untuk meluncurkannya.
Aktivasi dan Pennonaktifkanan Aplikasi
Windows memungkinkan pengguna beralih antar aplikasi. Cara paling umum adalah menggunakan kombinasi tombol ALT+TAB. Aplikasi hanya dapat dialihkan jika memiliki tampilan Window yang dapat dipilih pengguna. Yang saat ini dipilih Window adalah jendela aktif (juga dikenal sebagai jendela latar depan) dan merupakan Window yang menerima input pengguna. Aplikasi dengan jendela aktif adalah aplikasi aktif (atau aplikasi latar depan). Aplikasi menjadi aplikasi aktif dalam keadaan berikut:
Ini diluncurkan dan menunjukkan Window.
Pengguna beralih dari aplikasi lain dengan memilih Window di aplikasi.
Anda dapat mendeteksi kapan aplikasi menjadi aktif dengan menangani Application.Activated peristiwa.
Demikian juga, aplikasi dapat menjadi tidak aktif dalam keadaan berikut:
Pengguna beralih ke aplikasi lain dari aplikasi saat ini.
Ketika aplikasi dimatikan.
Anda dapat mendeteksi kapan aplikasi menjadi tidak aktif dengan menangani Application.Deactivated peristiwa.
Kode berikut menunjukkan cara menangani Activated peristiwa dan Deactivated untuk menentukan apakah aplikasi aktif.
<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
Juga Window dapat diaktifkan dan dinonaktifkan. Lihat Window.Activated dan Window.Deactivated untuk informasi selengkapnya.
Catatan
Baik Application.Activated maupun Application.Deactivated dinaikkan untuk XBAP.
Penonaktifan Aplikasi
Masa pakai aplikasi berakhir ketika dimatikan, yang dapat terjadi karena alasan berikut:
Pengguna menutup setiap Window.
Pengguna menutup utama Window.
Pengguna mengakhiri sesi Windows dengan log keluar atau mematikan.
Kondisi khusus aplikasi telah terpenuhi.
Untuk membantu Anda mengelola penonaktifan aplikasi, Application berikan metode, ShutdownMode properti, dan SessionEnding peristiwa dan Exit .Shutdown
Catatan
Shutdown hanya dapat dipanggil dari aplikasi yang memiliki UIPermission. Aplikasi WPF mandiri selalu memiliki izin ini. Namun, XBAP yang berjalan di kotak pasir keamanan kepercayaan parsial zona Internet tidak.
Mode Matikan
Sebagian besar aplikasi dimatikan baik ketika semua jendela ditutup atau ketika jendela utama ditutup. Namun, terkadang, kondisi khusus aplikasi lainnya dapat menentukan kapan aplikasi dimatikan. Anda dapat menentukan kondisi di mana aplikasi Anda akan dimatikan dengan mengatur ShutdownMode dengan salah satu nilai enumerasi berikut ShutdownMode :
Nilai ShutdownMode default adalah OnLastWindowClose, yang berarti bahwa aplikasi secara otomatis dimatikan ketika jendela terakhir dalam aplikasi ditutup oleh pengguna. Namun, jika aplikasi Anda harus dimatikan saat jendela utama ditutup, WPF secara otomatis melakukannya jika Anda mengatur ShutdownMode ke OnMainWindowClose. Hal ini ditunjukkan di contoh berikut.
<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" />
Ketika Anda memiliki kondisi matikan khusus aplikasi, Anda mengatur ShutdownMode ke OnExplicitShutdown. Dalam hal ini, Anda bertanggung jawab untuk mematikan aplikasi dengan secara eksplisit memanggil Shutdown metode; jika tidak, aplikasi Anda akan terus berjalan bahkan jika semua jendela ditutup. Perhatikan bahwa Shutdown dipanggil secara implisit ketika ShutdownMode adalah OnLastWindowClose atau OnMainWindowClose.
Catatan
ShutdownMode dapat diatur dari XBAP, tetapi diabaikan; XBAP selalu dimatikan ketika dinavigasi jauh dari browser atau ketika browser yang menghosting XBAP ditutup. Untuk informasi selengkapnya, lihat Gambaran Umum Navigasi.
Akhir Sesi
Kondisi matikan yang dijelaskan oleh ShutdownMode properti khusus untuk aplikasi. Namun, dalam beberapa kasus, aplikasi dapat dimatikan sebagai akibat dari kondisi eksternal. Kondisi eksternal yang paling umum terjadi ketika pengguna mengakhiri sesi Windows dengan tindakan berikut:
Pengelogan nonaktif
Mematikan
Restart
Hibernasi
Untuk mendeteksi kapan sesi Windows berakhir, Anda dapat menangani SessionEnding peristiwa, seperti yang diilustrasikan dalam contoh berikut.
<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
Dalam contoh ini, kode memeriksa ReasonSessionEnding properti untuk menentukan bagaimana sesi Windows berakhir. Ini menggunakan nilai ini untuk menampilkan pesan konfirmasi kepada pengguna. Jika pengguna tidak ingin sesi berakhir, kode diatur Cancel untuk true
mencegah sesi Windows berakhir.
Catatan
SessionEnding tidak dinaikkan untuk XBAP.
Keluar
Ketika aplikasi dimatikan, aplikasi mungkin perlu melakukan beberapa pemrosesan akhir, seperti status aplikasi yang bertahan. Untuk situasi ini, Anda dapat menangani Exit peristiwa, seperti yang App_Exit
dilakukan penanganan aktivitas dalam contoh berikut. Ini didefinisikan sebagai penanganan aktivitas dalam file App.xaml . Implementasinya disorot dalam file App.xaml.cs dan Application.xaml.vb .
<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
Untuk contoh lengkapnya, lihat Mempertahankan dan Memulihkan Properti Cakupan Aplikasi Di Seluruh Sesi Aplikasi.
Exit dapat ditangani oleh aplikasi mandiri dan XBAP. Untuk XBAP, Exit dimunculkan ketika dalam keadaan berikut:
XBAP dinavigasi menjauh.
Di Internet Explorer, ketika tab yang menghosting XBAP ditutup.
Saat browser ditutup.
Kode Keluar
Aplikasi sebagian besar diluncurkan oleh sistem operasi sebagai respons terhadap permintaan pengguna. Namun, aplikasi dapat diluncurkan oleh aplikasi lain untuk melakukan beberapa tugas tertentu. Ketika aplikasi yang diluncurkan dimatikan, aplikasi peluncuran mungkin ingin mengetahui kondisi di mana aplikasi yang diluncurkan dimatikan. Dalam situasi ini, Windows memungkinkan aplikasi untuk mengembalikan kode keluar aplikasi saat dimatikan. Secara default, aplikasi WPF mengembalikan nilai kode keluar 0.
Catatan
Saat Anda men-debug dari Visual Studio, kode keluar aplikasi ditampilkan di jendela Output saat aplikasi dimatikan, dalam pesan yang terlihat seperti berikut ini:
The program '[5340] AWPFApp.vshost.exe: Managed' has exited with code 0 (0x0).
Anda membuka jendela Output dengan mengklik Output pada menu Tampilan .
Untuk mengubah kode keluar, Anda dapat memanggil Shutdown(Int32) kelebihan beban, yang menerima argumen bilangan bulat menjadi kode keluar:
// Shutdown and return a non-default exit code
Application.Current.Shutdown(-1);
' Shutdown and return a non-default exit code
Application.Current.Shutdown(-1)
Anda dapat mendeteksi nilai kode keluar, dan mengubahnya, dengan menangani Exit peristiwa. Penanganan Exit aktivitas diteruskan yang ExitEventArgs menyediakan akses ke kode keluar dengan ApplicationExitCode properti . Untuk informasi selengkapnya, lihat Exit .
Catatan
Anda dapat mengatur kode keluar di aplikasi mandiri dan XBAP. Namun, nilai kode keluar diabaikan untuk XBAP.
Pengecualian Tidak Tertangani
Terkadang aplikasi dapat dimatikan dalam kondisi abnormal, seperti ketika pengecualian yang tidak diantisipasi dilemparkan. Dalam hal ini, aplikasi mungkin tidak memiliki kode untuk mendeteksi dan memproses pengecualian. Jenis pengecualian ini adalah pengecualian yang tidak tertangani; pemberitahuan yang mirip dengan yang ditunjukkan pada gambar berikut ditampilkan sebelum aplikasi ditutup.
Dari perspektif pengalaman pengguna, lebih baik aplikasi menghindari perilaku default ini dengan melakukan beberapa atau semua hal berikut:
Menampilkan informasi yang mudah digunakan.
Mencoba untuk menjaga aplikasi tetap berjalan.
Merekam informasi pengecualian terperinci dan ramah pengembang di log peristiwa Windows.
Menerapkan dukungan ini tergantung pada kemampuan untuk mendeteksi pengecualian yang tidak tertangani, yang merupakan tujuan DispatcherUnhandledException dimunculkannya peristiwa tersebut.
<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
Penanganan DispatcherUnhandledException aktivitas diteruskan parameter DispatcherUnhandledExceptionEventArgs yang berisi informasi kontekstual mengenai pengecualian yang tidak tertangani, termasuk pengecualian itu sendiri (DispatcherUnhandledExceptionEventArgs.Exception). Anda dapat menggunakan informasi ini untuk menentukan cara menangani pengecualian.
Ketika Anda menangani , Anda harus mengatur DispatcherUnhandledExceptionEventArgs.Handled properti ke true
; jika tidak, WPF masih menganggap pengecualian tidak tertangani DispatcherUnhandledExceptiondan kembali ke perilaku default yang dijelaskan sebelumnya. Jika pengecualian yang tidak tertangani dinaikkan dan DispatcherUnhandledException peristiwa tidak ditangani, atau peristiwa ditangani dan Handled diatur ke false
, aplikasi segera dimatikan. Selain itu, tidak ada peristiwa lain Application yang dimunculkan. Akibatnya, Anda perlu menangani DispatcherUnhandledException apakah aplikasi Anda memiliki kode yang harus berjalan sebelum aplikasi dimatikan.
Meskipun aplikasi dapat dimatikan sebagai akibat dari pengecualian yang tidak tertangani, aplikasi biasanya dimatikan sebagai respons terhadap permintaan pengguna, seperti yang dibahas di bagian berikutnya.
Peristiwa Seumur Hidup Aplikasi
Aplikasi mandiri dan XBAP tidak memiliki masa pakai yang sama persis. Gambar berikut mengilustrasikan peristiwa utama dalam masa pakai aplikasi mandiri dan menunjukkan urutan di mana mereka dinaikkan.
Demikian juga, gambar berikut mengilustrasikan peristiwa utama dalam masa pakai XBAP, dan menunjukkan urutan di mana mereka dinaikkan.
Lihat juga
.NET Desktop feedback