WPF开发工具是由微软研发的一款UI领域的图形界面处理工具。可以帮助程序员们很方便的实现特殊的图形界面效果。Form 类似, WPF 同样需要一个 Application 来统领一些全局的行为和操作,并且每个 Domain 中只能有一个WPF Application实例存在。#t#
和 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." …… 不过这次自动生成的代码存放位置更加古怪 —— objDebugApp.g.cs。
- public partial class App :
System.Windows.Application- {
- [DebuggerNonUserCode]
- public void Initialize
Component()- {
- 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 Application依旧使用一个 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);
- }
- }
WPF 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.GetEntry
Assembly().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();
- }
以上就是我们通过各种实例代码为大家解读的WPF Application相关概念。