WPF 学习笔记 - 1. Application

本文介绍了WPF应用程序的基本结构,包括App.xaml和App.xaml.cs的作用,如何定义和启动主窗口,以及Application类提供的实用属性和方法。

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

 

### 关于WPFWindows Presentation Foundation)的学习资源 #### 推荐学习路径与教程 对于希望深入了解 Windows Presentation Foundation (WPF) 的开发者来说,《深入浅出WPF》系列高清视频教程由讲师刘铁猛提供,该课程不仅涵盖了基础概念还涉及高级主题[^1]。此套教材适合初学者逐步掌握 WPF 开发技能。 #### 基础组件介绍 在构建基于 WPF 应用程序的过程中,`Application` 类以及 `FrameworkElement` 和 `FrameworkContentElement` 这两个基类扮演着重要角色;它们共同拥有一个名为 Resources 的属性用于定义全局可用的资源集合[^2]。这些基础知识构成了理解更复杂特性的基石。 #### 实际应用案例分析 当创建一个新的 WPF 工程时,Visual Studio 将依据所选模板自动生成必要的配置文件,并通过调用相应的编译工具链来处理源码直至生成可执行的目标文件[^3]。这一过程简化了项目的初始化工作,使得开发人员可以更快地上手实践。 #### XAML 编写技巧展示 下面是一个简单的例子展示了如何利用静态资源引用来自定义按钮样式的部分代码片段: ```xml <Window.Resources> <Style x:Key="baseStyle" TargetType="Control"> <!-- 定义基本样式 --> </Style> </Window.Resources> <Button Style="{StaticResource ButtonStyle}" Content="test"/> ``` 上述 XML 片段说明了怎样设置控件外观并通过继承机制实现一致的设计风格[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值