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 时,它会创建每个控件对象,设置其属性,并关联所有事件处理程序。

posted @ 2023-11-10 15:22  茜茜87  阅读(10)  评论(0编辑  收藏  举报