WPF2 XAML本质

每一个新建的WPF程序,核心部分包括:

1、Properties:程序会用到的一些资源(图标、图片、静态字符串)和配置信息

2、引用:标记当前项目需要引用哪些其他项目。

3、App.xaml:程序主体,App.xaml文件用于声明程序进程会是谁,同时指定程序主窗体是谁。

4、MainWindow.xaml:程序主窗体。

xaml文件都会带有xaml.cs文件。

重点是MainWindow.xaml。

<Window x:Class="WPF_1_XAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        
    </Grid>
</Window>

xaml是xml的派生语言,很多概念彼此通用。要注意,每个标签都会对应内存中的一个对象。

xaml包括2种写法:

1、非空标签:<Tag Attribute1=Value1 Attribute2=Value2>Content</Tag>

2、空标签:<Tag Attribute1=Value1 />

Property是一类抽象事物所具有的特性,Attribute则是为了区分同类元素A和B的区别特征。

一、xmlns

xmlns特征用来定义命名空间,语法特征为:xmlns [:可选的映射前缀]="命名空间"。

如果不使用映射前缀,那么所有来自于这个命名空间的标签前都不用加前缀,这个没有映射前缀的命名空间被称为“默认命名空间”,它只能有一个,一般会选择使用频率最高的命名空间来充当默认命名空间。

<Window>和<Grid>都来自于xmlns所在的默认命名空间。

而第一行的Class特征则来自于第三行中x:前缀对应的命名空间。如果修改了默认命名空间,比如加入了前缀,那么它对应的xaml元素也要一并加入前缀。

<n:Window x:Class="WPF_1_XAML.MainWindow"
        xmlns:n="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <n:Grid>
        
    </n:Grid>
</n:Window>

如果要引用外来程序集,比如System.Windows.Controls命名空间里的Button类,则先要把包含System.Windows.Controls命名空间的程序集PresentationFramework.dll通过引用的方式引用到项目中,然后再在根元素的起始标签中写上一句:xmlns:c="clr-namespace:System.Windows.Controls;assembly=PresentationFramework",当然编译器会自动补全这一串。

其中类似http://,,,这一类的xmlns被称为硬编码,它会把一系列必要的程序集和.NET命名空间包含进来,注意是一系列而不是一个。

x:Class=“WPF_1_XAML.MainWindow”这个Attribute的作用是当xaml解析器将包含它的标签解析成C#类后,这个类的类名是什么。因此,如果删除x:Class和cs中InitializeComponent,程序还是可以运行的,因为App.xaml中指定了StartupUri="MainWindow.xaml",而如果恢复x:Class这一行,但改名为MainWindow1.xaml,再编译,生成的就是MainWindow1为名的窗体。

再注意到,MainWindow.xaml.cs中有一个partial关键字,于是其核心意义就很明显了:

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }

 

XAML解析生成的类和对应XAML.CS的类都是MainWindow的部分类,正是由于这种partial机制,类的逻辑代码留在了xaml.cs中,而与声明和布局相关的UI被分离到xaml中,实现了UI和逻辑的分离。

 

posted @ 2020-05-28 21:29  NicolasLiaoRan  阅读(121)  评论(0编辑  收藏  举报