WPF學習筆記

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.