WPF介绍
1. Xaml标记实现和代码隐藏
查看代码
<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid>
<Slider HorizontalAlignment="Left" Margin="106,38,0,0" VerticalAlignment="Top" Width="621" Value="{Binding Input1}"/>
<Slider HorizontalAlignment="Left" Margin="106,83,0,0" VerticalAlignment="Top" Width="621" Value="{Binding Input2}"/>
<Slider HorizontalAlignment="Left" Margin="106,132,0,0" VerticalAlignment="Top" Width="621" Value="{Binding Result}"/>
<!--点击按钮时触发命令-->
<Button Content="Button" HorizontalAlignment="Left" Margin="355,200,0,0" VerticalAlignment="Top" Width="99" Height="29" Command="{Binding AddCommand}"/>
</Grid>
</Window>
更新的标记定义 xmlns:x
命名空间,并将其映射到为代码隐藏类型添加支持的架构。 x:Class
特性用于将代码隐藏类与此特定 XAML 标记相关联。 考虑此特性在 <Window>
元素上声明,代码隐藏类必须从 Window
类继承。
查看代码
namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
// InitializeComponent call is required to merge the UI
// that is defined in markup with this class, including
// setting properties and registering event handlers
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
}
}
从代码隐藏类的构造函数调用 InitializeComponent
,以将标记中定义的 UI 与代码隐藏类合并在一起。x:Class
和 InitializeComponent
的组合可确保在创建实现时正确地对其进行初始化。
若要使 XAML 标记文件和代码隐藏文件配合工作,需要满足以下要求:
-
在标记中,
Window
元素必须包含x:Class
属性。 生成应用程序时,标记文件中存在x:Class
会使 Microsoft 生成引擎 (MSBuild) 生成派生自 Window 的partial
类,其名称由x:Class
属性指定。 这要求为 XAML 架构 (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
) 添加 XAML 命名空间声明。 生成的partial
类实现InitializeComponent
方法,注册事件和设置在标记中实现的属性时将调用此方法。 -
在代码隐藏中,类必须是
partial
类、名称必须是标记中x:Class
属性指定的相同名称,并且它必须派生自 Window。 这样,代码隐藏文件就与应用程序生成时为标记文件生成的partial
类相关联 -
在代码隐藏中,Window 类必须实现调用
InitializeComponent
方法的构造函数。InitializeComponent
由标记文件已生成的partial
类实现,用以注册事件并设置标记中定义的属性。
2. XAML编译
BAML(二进制应用程序标记语言)实际上就是 XAML 的二进制表示。在运行时加载 BAML,比动态加载 XAML 的效率高,当用户界面比较复杂时尤其如此。
所有 XAML 文件都被转换为 BAML,并且这些 BAML 然后作为资源被嵌入到最终的 DLL 或 EXE 程序集中。
编译过程(foo.xaml):
1) 解析 foo.xaml (解析器:System.Xml.XmlTextReader)
2) markup 编译器调用BAMLWriter 在obj\release\.目录产生foo.baml
3) markup 编译器生成一个Partial类保存到foo.g.cs文件中
2.1 XAML 名称空间
在创建的所有 WPF XAML 文档中都会使用这两个名称空间:
http://schemas.microsoft.com/winfx/2006/xaml/presentation
是 WPF 核心名称空间。它包含了所有 WPF 类,包括用来构建用户界面的控件。http://schemas.microsoft.com/winfrx/2006/xaml
是 XAML 名称空间。它包含各种 XAML 实用特性,这些特性可影响文档的解释方式。该名称空间被映射为前缀x。
2.2 XAML标准
- XAML 文档中的每个元素都映射为 .NET 类的一个实例。元素的名称也完全对应于类名。例如,元素<Button>指示 WPF 创建 Button 对象。
- 与所有 XML 文档一样,可在一个元素中嵌套另一个元素。
- 可通过特性(attribute)设置每个类的属性(property)。
2.3 XAML 顶级元素:
- Window 元素
- Page 元素(可用于导航)
- Application 元素(该元素定义应用程序资源和启动设置)
2.4 InitalizeComponent()
InitalizeComponent()方法的所有工作就是调用 System.Windows.Application 类的 LoadedComponent()方法。LoadComponent()方法从程序集中提取 BAML(编译过的 XAML),并用它来构建用户界面。当解析 BAML 时,它会创建每个控件对象,设置其属性,并关联所有事件处理程序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!