新建项目

在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. mermaid图详解(一)流程图|超详细的代码解释

    本文参考Github项目 https://github.com/mermaid-js/mermaid/ 前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客 ...

  2. java代码实现自动生成数据库表er图

    最近有同事看到字节跳动产品设计文档里有数据库表er图.就想问问又没有现成的工具也给直接生成一个er图,经查找验证发现并没有.因为现在表关系都是用的逻辑外键而非物理外键约束的,所以像navicat等工具 ...

  3. 如何在 Mac 上配置 VirtualBox Host-Only 网络适配器

    默认Mac 上安装 VirtualBox 后,没有自动配置Host-Only 网络适配器,需要我们手工添加.方法如下: 打开VirtualBox软件, 依次点击 "管理 -> 工具 - ...

  4. 【译】.NET 8 网络改进(二)

    原文 | Máňa,Natalia Kondratyeva 翻译 | 郑子铭 修改 HttpClient 日志记录 自定义(甚至简单地关闭)HttpClientFactory 日志记录是长期请求的功能 ...

  5. JS Leetcode 26. 删除有序数组中的重复项 题解分析,字典与快慢双指针

    壹 ❀ 引 本题来自LeetCode26. 删除有序数组中的重复项,是一道简单题,题目描述如下: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组 ...

  6. JS leetcode 最长公共前缀 题解分析

    壹 ❀ 引 今天做的又是一道让我沮丧的题,思路有,但是代码逻辑最后还是没能正确理出来,题名为最长公共前缀,题目如下: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 ...

  7. NC24734 [USACO 2010 Mar G]Great Cow Gathering

    题目链接 题目 题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, ...

  8. NC15445 wyh的吃鸡

    题目链接 题目 题目描述 最近吃鸡游戏非常火,你们wyh学长也在玩这款游戏,这款游戏有一个非常重要的过程,就是要跑到安全区内,否则就会中毒持续消耗血量,我们这个问题简化如下 假设地图为n*n的一个图, ...

  9. 开年!5 款令人惊艳的开源项目「GitHub 热点速览」

    朋友们开工大吉啊!我刚从假期模式切换回来,完全无心工作有些不在状态,比如开机密码错了好几次.闲话少叙,下面就让我们一起看看,春节这段时间 GitHub 上又出了什么有趣.好玩的开源项目. 今年上来就是 ...

  10. tmpwatch命令

    tmpwatch命令 tmpwatch递归删除给定时间内未访问的文件,通常用于清理用于临时存放空间的目录,并可以设置文件超期时间,默认单位以小时计算. 语法 tmpwatch [-u | -m | - ...