新建项目

在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. Java多线程-ThreadPool线程池-3(五)

    除了可以通过ThreadPoolExecutor自定义线程池外,同Stream API中的Collectors一样,多线程里的Executors类也提供了一组相关的线程池工具,可以直接拿来用,不用考虑 ...

  2. webrtc终极版(一)5分钟搭建多人实时会议系统webrtc

    webrtc终极版(一),支持https,在线部署[不是本地demo],采用RTCMultiConnection官方demo,5分钟即可搭建成功 @ 目录 webrtc终极版(一),支持https,在 ...

  3. 【OpenVINO™】在 MacOS 上使用 OpenVINO™ C# API 部署 Yolov5

    在 MacOS 上使用 OpenVINO C# API 部署 Yolov5 项目介绍 YOLOv5 是革命性的 "单阶段"对象检测模型的第五次迭代,旨在实时提供高速.高精度的结果, ...

  4. 《ASP.ENT Core 与 RESTful API 开发实战》-- (第5章)-- 读书笔记(中)

    第 5 章 使用 Entity Framework Core 5.3 重构仓储类 创建一个通用仓储接口 namespace Library.API.Services { public interfac ...

  5. [Ngbatis源码学习][Spring] Spring 的资源管理 ResourceLoader

    在学习Ngbatis的源码时,看到了有关xml文件的加载,涉及到了资源的加载,对相关知识进行总结与整理. 1. 相关类 Resource AbstractResource ResourceLoader ...

  6. Power BI 6 DAY

    Power BI 数据建模与数据汇总分析 层级关系 跨表取字段时类型二可用 父子级关系条件 一个父级下对应多个子级值 一个子级值只属于一个父级 跨表取字段的条件:维度连接用关键字段间是父子级关系时,可 ...

  7. SQLite 入门教程

    不是 MySQL 用不起,而是 SQLite 更有性价比,绝大多数的 Web 应用 SQLite 都可以满足. SQLite 是一个用 C 语言编写的开源.轻量级.快速.独立且高可靠性的 SQL 数据 ...

  8. C++ 多线程的错误和如何避免(10)

    线程中的异常可以使用 std::rethrow_exception 抛给主线程 问题分析:一个线程中抛出的异常是没法被另一个线程捕获的.假如我们在主线程中创建一个子线程,子线程中的函数抛出了异常,主线 ...

  9. 【Android逆向】反调试绕过(nop 绕过)

    1. 这是看雪上的一个题目,要求显示出 it is success https://www.kanxue.com/work-task_read-800648.htm 第三题 2. apk 安装到手机, ...

  10. 3D环饼图

    // <div class="AnalysisAccCom">         <first-title title="分析对象统计"> ...