WPF 應用程式每個 AppDomain 僅能存在單一 Application 實例。預設由 App.xaml (聲明) + App.xaml.cs (行為) 組成,類似 Delphi/WebForm 的定義與程式碼分離模式。
public partial class App : Application { }
public partial class App : System.Windows.Application
{
[DebuggerNonUserCode]
public void InitializeComponent()
{
this.StartupUri = new System.Uri("Window1.xaml", System.UriKind.Relative);
}
[STAThread]
[DebuggerNonUserCode]
public static void Main()
{
App app = new App();
app.InitializeComponent();
app.Run();
}
}
StartupUri:指定啟動視窗Run():啟動訊息迴圈 (委派 Dispatcher.Run())STAThread:WPF 仍使用單一 UI 執行緒 (STA 模式)public class App : Application
{
[STAThread]
private static void Main()
{
var app = new App();
var window = new Window { Title = "WPF" };
app.Run(window);
}
}
| 成員 | 用途 |
|---|---|
Current | 取得目前 AppDomain 的 Application 實例 |
MainWindow | 取得主視窗實例 |
Windows | 取得所有已具現化的 Window 集合 |
ShutdownMode | 關閉模式:主視窗關閉 / 最後視窗關閉 / 手動 Shutdown() |
Properties | 執行緒安全的全域字典,跨視窗共享資料 |
Shutdown(exitCode) | 終止應用程式,可傳回碼給作業系統 |
private void Application_Startup(object sender, StartupEventArgs e)
{
var createdNew = false;
var name = Assembly.GetEntryAssembly().FullName;
new Mutex(true, name, out createdNew);
if (!createdNew)
{
MessageBox.Show("已有實例執行中,結束!");
Application.Current.Shutdown();
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
var window2 = Application.Current.Windows
.OfType<Window>()
.FirstOrDefault(w => w is Window2);
if (window2 == null) window2 = new Window2();
window2.Show();
window2.Activate();
}
Startup:應用程式啟動 (初始化資源、單例檢查)Exit:應用程式關閉 (釋放資源、儲存設定)SessionEnding:Windows 登出/關機DispatcherUnhandledException:UI 執行緒未處理例外