新建项目

在Visual Studio 2019中使用WPF项目模板建立一个最简单的WPF项目,如下图所示:



可以看到,项目里面主要有两个分支:

  • App.xaml分支:程序的主体,声明了程序的进程会是谁,同时指定了程序的主窗体是谁,分支里的App.xaml.cs是App.xaml的后台代码。
  • MainWindow.xaml分支:程序的主窗体,具有自己的后台代码Windowl.xaml.cs,默认两个文件。

    在Windows系统里一个程序就是一个进程(Proces),一个GUl进程需要有一个窗体(Window)作为“主窗体”。

    接下来我们重点分析MainWindow.xaml和它的后台代码。

剖析XAML代码

在MainWindow.xaml里能看到如下代码:

<Window x:Class="LearnWpf.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:LearnWpf"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Grid> </Grid>
</Window>

XAML是一种由XML派生而来的语言,很多XML中的概念在XAML是通用的,如:

  • 使用标签声明一个元素(每个元素对应内存中的一个对象)时需要使用起始标签<Tag>终止标签</Tag>
  • 夹在起始标签和终止标签中的XAML代码表示是隶属于这个标签的内容
  • 如果没有什么内容隶属于某个标签,则这个标签称为空标签,可以写为<Tag/>

为了表示同类标签中的某个标签与众不同,可以给它的特征(Attribute)赋值,为特征赋值的语法如下:

  • 非空标签:<Tag Attributel=Valuel Attribute2=Value2>Content
  • 空标签:<Tag Attributel=Valuel Attribute2=Value2/>

为了表示同类标签中的某个标签与众不同,可以给它的特征(Atribute)赋值。为特征赋值的语法如下:

·非空标签:<Tag Aributel=Valuel Attribute2-Value2>Content

·空标签:<Tag Attributel=Valuel Attribute2=Value2>

注意Attribute(特性)Property(属性)的区别,Attribute和Property是两个层面上的东西:

  • Attribute则是编程语言文法层面的东西,只与语言层面上的东西相关
  • Property属于面向对象理论范畴,是针对对象而言的
  • XAML中把标签的Attribute与对象的Property做了一个映射,但也不是完全映射的,比如,x:Class特性

MainWindow.xaml的总体结构是一个标签内部包含着一个标签(或者说标签是标签的内容,如下代码段所示),代表的含义是一个窗体对象内嵌套着一个Grid对象:

<Window>
<Grid> </Grid>
</Window>

<Window>标签的Attribute如下所示:

x:Class="LearnWpf.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:LearnWpf"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"
  • 最上面一行是在使用名为Class的Aturibute,这个Attribute来自于x:前缀所对应的名称空间,x:Class特性告诉XAML编译器将编译结果和哪个C#编译的类合并
  • 中间五行是在声明名称空间,xmlns也就是XML-Namespace的缩写,xmlns后可以跟一个可选的映射前缀并用冒号分隔
  • mc:Ignorable命名空间提供了xaml处理器“忽略”的xaml定义,允许您指定设计者在设计时使用的信息(在运行时被忽略),如d:DesignHeight="725" d:DesignWidth="1015"
  • Title、Height和Width是与Window对象的Property相对应的

如果没有写可选映射前缀,那就意味着所有来自于这个名称空间的标签前都不用加前缀,这个没有映射前缀的名称空间称为“默认名称空间”——默认名称空间只能有一个,而且应该选择其中元素被最频繁使用的名称空间来充当默认名称空间。

上面看上去像网页地址的名称空间是XAML解析器的一个硬性编码(hard-coding),只要见到这些固定的字符串就会把一系列必要的程序集(Assembly)和程序集中包含的.NET名称空间引用进来。在XAML中引用外来程序集和其中.NET名称空间与C#的语法不同,需要在根元素的起始标签中声明命名空间,如:xmlns:c="clr-namespace:System.Windows.Controls;assembly=PresentationFramework",c是映射前缀(可换成其他的字符串,如control),其中的命名空间、程序集根据实际情况确定。硬性编码可以看成批量的程序集和程序集中包含的.NET名称空间引用,它们共用一个命名空间前缀。

参考资料

深入浅出WPF-从零起步认识XAML 网盘提取码:5w20

WPF学习之X名称空间详解

c# – 什么意思mc:Ignorable =“d”在WPF?

WPF之认识XAML的更多相关文章

  1. 学习WPF——了解WPF中的XAML

    XAML的简单说明 XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面 XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Butt ...

  2. WPF后台设置xaml控件的样式System.Windows.Style

    WPF后台设置xaml控件的样式System.Windows.Style 摘-自 :感谢 作者: IT小兵   http://3w.suchso.com/projecteac-tual/wpf-zhi ...

  3. WPF后台访问XAML元素

    当我们需要从后台访问xaml文件时,我们可以通过这样的方式来操作: private void button1_Click(object sender, RoutedEventArgs e) { Sys ...

  4. WPF中 PropertyPath XAML 语法

    原文:WPF中 PropertyPath XAML 语法 PropertyPath 对象支持复杂的内联XAML语法用来设置各种各样的属性,这些属性把PropertyPath类型作为它们的值.这篇文章讨 ...

  5. 【广州.NET社区推荐】【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  6. 【译】Visual Studio 2019 中 WPF & UWP 的 XAML 开发工具新特性

    原文 | Dmitry 翻译 | 郑子铭 自Visual Studio 2019推出以来,我们为使用WPF或UWP桌面应用程序的XAML开发人员发布了许多新功能.在本周的 Visual Studio ...

  7. WPF 绑定属性 XAML 时间格式化

    原文:WPF 绑定属性 XAML 时间格式化 XAML 时间格式化{Binding Birthday,StringFormat='yyyy-MM-dd '} public class AssetCla ...

  8. WPF关于Generic.xaml

    如果需要用到Themes/Generic.xaml作为默认风格资源文件,不要忘了该项目的AssemblyInfo.cs中必须要有以下这段: [assembly: ThemeInfo( Resource ...

  9. 关于WPF中的XAML

    XAML全称extensible application markup language(可扩展性标记语言) 可扩展应用程序标记语言(XAML)是一种声明性语言.概括来说,就是为应用程序构建UI.目前 ...

  10. 在C#的WPF程序使用XAML实现画线

    在WPF中画直线.新建WPF应用程序,使用XAML画直线.使用X1.Y1两个属性可以设置直线的起点坐标,X2.Y2两个属性则可以设置直线的终点坐标.控制起点/终点坐标就可以实现平行.交错等效果.Str ...

随机推荐

  1. 2.11 PE结构:添加新的节区

    在可执行PE文件中,节(section)是文件的组成部分之一,用于存储特定类型的数据.每个节都具有特定的作用和属性,通常来说一个正常的程序在被编译器创建后会生成一些固定的节,通过将数据组织在不同的节中 ...

  2. 重写JSON.stringify与JSON.parse使其支持解析function类型

    const JSONStringify = (option) => { return JSON.stringify(option, (key, val) => { // 处理函数丢失问题 ...

  3. spring-cloud 配置管理

    作用: 实现配置热更新 实现网关配置热部署 配置模板 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc ...

  4. 使用ethtool排查网卡速率问题

    今天去现场帮一个客户排查备份网络速率问题. 用户期望是万兆的速率,但实际上目前只有千兆,因为目前上面运行着数据库,且数据量较大,千兆的备份网络速率不能满足用户备份数据库的时长要求. 首先,确认备份网络 ...

  5. Linux-yum卸载软件包

    yum是Linux操作系统中最常用的软件包管理器之一,它可以帮助你很容易地安装.删除和更新软件包.然而,有时候yum在删除软件包时可能会出现一些问题,本文将告诉你如何正确地使用yum卸载软件包,并解决 ...

  6. Pandas—to_csv()写入函数参数详解

    1. to_csv函数的参数 DataFrame.to_csv(path_or_buf=None, sep=',', na_rep='', float_format=None, columns=Non ...

  7. NC20277 [SCOI2010]字符串

    题目链接 题目 题目描述 lxhgww最近接到了一个生成字符串的任务,任务需要他把n个1和m个0组成字符串,但是任务还要求在组成的字符串中,在任意的前k个字符中,1的个数不能少于0的个数.现在lxhg ...

  8. NC19987 [HAOI2012]ROAD

    题目链接 题目 题目描述 C国有n座城市,城市之间通过m条单向道路连接.一条路径被称为最短路,当且仅当不存在从它的起点到终点的另外一条路径总长度比它小.两条最短路不同,当且仅当它们包含的道路序列不同. ...

  9. 【Unity3D】选中物体消融特效

    1 消融特效原理 ​ 消融特效 中基于 Shader Graph 实现了消融特效,本文将基于 Shader 实现消融特效. ​ 当前实现消融特效的方法主要有 Alpha 测试消融.clip(或 dis ...

  10. Mobx与Redux的异同

    Mobx与Redux的异同 Mobx与Redux都是用来管理JavaScript应用的状态的解决方案,用以提供在某个地方保存状态.修改状态和更新状态,使我们的应用在状态与组件上解耦,我们可以从一个地方 ...