XAML(Extensible Application Markup Language的简写)是用于实例化.NET对象的标记语言。XAML对于WPF不是必须的。

XAML基础

XAML标准:

  • XAML文档中的每个元素都映射为.NET类的一个实例。
  • 与所有XML文档一样,可在一个元素中嵌套另一个元素。
  • 可通过特性(attribute)设置每个类的属性(property)。

XAML名称空间

xmlns特性是XML中的一个特殊特性,专门用来声明名称空间。

标记扩展

如果将属性值设置为一个已经存在的对象,或者将一个属性绑定到另一个控件来动态地设置属性值,这些情况都需要使用标记扩展-非常规的方式设置属性的专门语法。

标记扩展可以用于嵌套标签或 XML 特性中,当用在特性中时总是被花括号{}包围起来。

<Button x:Name="btn" Foreground="{x:Static SystemColors.ActiveCaptionBrush}">

上面例子中,标记扩展是 StaticExtension 类(约定在引用扩展类时可以省略最后一个单词 Extension)。

所有标记扩展都继承自 System.Windows.Markup.MarkupExtension 。

附加属性

附加属性用于多个控件但在另一个类中定义的属性,在WPF中常用于控件布局。附加属性不是真正的属性,实际上被转换为方法调用。

<!--Grid.SetRow(txt,2)-->
<TextBox x:Name="txt" Grid.Row="2">
</TextBox>

附加属性时WPF的核心要素,充当通用的可扩展系统。如果选择将该属性作为基类的一部分,不仅会使公共接口变得十分杂乱,而且也不能添加需要新属性的新类型的容器。

嵌套元素

XAML让每个元素决定如何处理嵌套的元素。

  • 如果父元素实现了 IList 接口,解析器将调用 IList.Add() 方法,并且为该方法传入子元素作为参数
  • 如果父元素实现了 IDictionary 接口,解析器将调用 IDictionary.Add() 方法,并且为该方法传递子元素作为参数。当使用字典时还必须设置 x:Key 特性以便为每个条目指定键名。
  • 如果父元素使用 ContentProperty 特性进行修饰,解析器将使用子元素设置对应的属性。
<LinearGradientBrush>
<LinearGriadientBrush.GradientStops>
<GridientStop Offset="0.00" Color="Red"/>
<GridientStop Offset="0.50" Color="Indigo"/>
<GridientStop Offset="1.00" Color="Violet"/>
</LinearGriadientBrush.GradientStops>
</LinearGradientBrush>

解析器知道 GradinetStops 属性返回一个 GradientStopCollection 对象而且实现了 IList 接口。因此,解析器使用 IList.Add() 方法将每个 GradientStop 对象添加到集合中。

所有继承自 ContentControl 类的控件只允许包含单一的嵌套元素。所有继承自 ItemsControl 类的控件允许包含一个条目集合。所有继承自 Panel 类的控件都是用来组织多组控件的容器。

特殊字符与空白

特殊字符 字符实体
< &lt;
> &gt;
& &amp;
" &quot;

我的公众号

WPF_02_XAML的更多相关文章

随机推荐

  1. linux停止进程

    $ kill -QUIT 主进程号 例如:kill -QUIT 1708 这种方式相对来说会有一个停止的过程,先将子进程停止掉,然后再停掉主进程. 快速停止Nginx: $ kill -TERM 主进 ...

  2. xml字符串转成数组(php)

    1 $str = '<xml> 2 <ToUserName> <![CDATA[gh_fc0a06a20993]]> </ToUserName> 3 & ...

  3. div居中和垂直居中的最简单方法

    div居中方法: 1)对父盒子添加 text-align="center": 2)子盒子添加 margin:0 auto; 例子: body{text-align:center} ...

  4. Modern PHP 使用生成器yield 处理csv文件 Generator

    * 使用生成器处理csv文件 <?php function getRows($file) { $handle = fopen($file, 'rb'); if ($handle === fals ...

  5. Appium Android Toast控件

    Android Toast控件是Android系统级别的控件,不是App的控件,getPageSource是⽆法找到的. Toast介绍 1.背景 在安卓设备里面,使用各种手机应用程序的时候,需要先进 ...

  6. mybatis多条件多值批量更新

    mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现. 这里使用了case when 这个小技巧来实现批量更新. 举个例子: UPDATE 表名 SET    display_ord ...

  7. P3293-[SCOI2016]美味【主席树】

    正题 题目链接:https://www.luogu.com.cn/problem/P3293 题目大意 给出一个长度为\(n\)的序列,\(m\)次询问给出\(b,x,l,r\)表示询问在\([l,r ...

  8. vite首次启动加载慢

    背景 随着vue3的到来,vite开始被各大vue3组件库使用,公司开始一个新项目,准备尝试用vite试一波. 问题发现 当把公司新项目移植到vite后,启动非常快,但发现页渲染时间慢了很多 可以看到 ...

  9. ORA-4031诊断分析

    1.Environment11.2.0.4 RAC 2.Symptomsrac的一节点alert日志一直刷ORA-4031报错,提示shared pool不足,二节点并没有此报错 Sat Oct 09 ...

  10. 【vscode高级玩家】Visual Studio Code❤️安装教程(最新版🎉教程小白也能看懂!)

    目录 如果您在浏览过程中发现文章内容有误,请点此链接查看该文章的完整纯净版 下载 Linux Mac OS 安装 运行安装程序 同意使用协议 选择附加任务 准备安装 开始安装 安装完成 如果您在浏览过 ...