程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WPF學習筆記 - 1. Application

WPF學習筆記 - 1. Application

編輯:關於.NET

和 WinForm 類似, WPF 同樣需要一個 Application 來統領一些全局的行為和操作,並且每個 Domain 中只能有一個 Application 實例存在。和 WinForm 不同的是 WPF Application 默認由兩部分組成 : App.xaml 和 App.xaml.cs,這有點類似於 Delphi Form,將定義和行為代碼相分離。當然,WebForm 也采用了類似的方式。XAML 從嚴格意義上說並不是一個純粹的 XML 格式文件,它更像是一種 DSL,它的所有定義都直接映射成某些代碼,只不過具體的翻譯工作由編譯器完成而已。

下面是一個簡單的 App 定義。

public partial class App : Application
{
}

當你在自動生成的 Project 代碼中看到 paritial 時,應該下意識去找找 "This code was generated by a tool." …… 不過這次自動生成的代碼存放位置更加古怪 —— obj\Debug\App.g.cs。

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();
 }
}

App.StartupUri 用於設置 MainWindow,App.Run() 啟動消息循環。當然,還有那個 STAThread,這意味著 WPF 依舊使用一個 UI Thread 來處理 UI Message。

我們完全可以捨棄自動生成的代碼,自己手工寫一個 App。

public class App : Application
{
 [STAThread]
 private static void Main()
 {
  var app = new App();
  var window = new Window { Title = "WPF" };
  app.Run(window);
 }
}

Application 提供了一些實用的屬性和方法。

Current: 獲取 Domain 中默認的 Application 實例。

MainWindow: 獲取主窗口實例。

Windows: 獲取所有被實例化的 Window 實例。

ShutdownMode: 指定 Application.Shutdown 方式,包括主窗體關閉,最後一個窗口關閉,以及手工調用 Shutdown()。

Properties: 一個線程安全的全局字典,可用來存儲一個公共信息。

Shutdown: 該方法終止 Application Process,可向操作系統返回一個退出碼。

我們依然可以使用 Mutex 來阻止運行多個實例。

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("There is already an instance running, Exit!");
  Application.Current.Shutdown();
 }
}

當然也可以用 Windows 屬性判斷窗體是否已經存在。

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();
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved