学习WPF——了解WPF中的XAML

XAML的简单说明

XAML是用于实例化.NET对象的标记语言,主要用于构建WPF的用户界面

XAML中的每一个元素都映射为.NET类的一个实例,例如<Button>映射为WPF的Button对象

XAML可以在一个元素中嵌套另一个元素,例如Grid元素可以嵌套Button元素

 

了解XAML

VisualStudio创建一个窗口,默认情况下产生的代码如下:

这段代码中包含两个标记元素,一个是Window,一个是Grid

Window是WPF顶级元素的一种,还有另外两种顶级元素Page和Application


Window
用于描述一个窗口

Page

和Window类似,但它用于可导航的应用程序

Application
用于定义应用程序资源和启动设置

任何一个XAML文档只能拥有一个顶级元素

属性

窗口标签中Title、Height、Width都是窗口的属性

在XAML文件中属性的值的类型总是字符串,

但XAML的解析器可以把这些字符串转换成.NET的任意类型

 

名称空间

在上面代码中,用xmlns属性来标记此文档从属于哪个名称空间

为什么需要名称空间呢?

如果我们在第三方组件中定义了Window类,如果没有一个名称空间做限定的话,

编译器不知道我们将使用哪个Window类型来渲染窗口

我们在上面的代码中,看到了两个名称空间,一个是WPF核心名称空间、一个是XAML名称空间


WPF核心名称空间

http://schemas.microsoft.com/winfx/2006/xaml/presentation

包含所有WPF类,包含用来构建用户界面的控件,是文档的默认名称空间


XAML名称空间

http://schemas.microsoft.com/winfx/2006/xaml

包含各种XAML实用特性,这些特性可以影响文档的解释方式,该名称空间被映射为前缀x,使用前需要标注前缀x,比如:<x:ElementName>

有了名称空间的限定,我们直接书写的<Grid>标签,才可以映射到System.Windows.Controls.Grid类上

代码隐藏类

XAML创建用户界面,但交互规则还是需要.NET语言编写

x:Class属性标记着与该XAML文件相配合的.NET类

注意这个类是一个“部分类”

这个部分类的构造函数中调用了InitializeComponent方法,

这个方法负责创建控件对象、设置属性、绑定事件、构造用户界面等工作

复杂属性

有些属性的值不是一个简单类型,而是一个对象,不如下面这个Grid的背景颜色



我们现在只要知道XAML解析器也能创建出复杂属性对应的值即可

标记扩展

如果我们希望把属性值绑定为一个已经存在的对象,那么我们可以使用静态标记扩展

标记扩展还有很多其他的用法,我们以后再聊

这里也涉及到了属性绑定,我们以后再聊

附加属性

对于嵌套的元素,子元素可以使用父元素定义的一些属性,这类属性就是附加属性

在WPF中附加属性多用于布局

修改记录

2015-1-5:完成全部内容

参考资料

《Pro WPF 4.5 in C# 4th Edition》

MSDN

备注

本篇只简单介绍了XAML的常见知识,还有一些不常见的知识、高级主题暂时没有涉及

 

 

时间: 2024-08-01 16:31:52

学习WPF——了解WPF中的XAML的相关文章

捕捉WPF应用程序中XAML代码解析异常

由于WPF应用程序中XAML代码在很多时候是运行时加载处理的.比如DynamicResource,但是在编译或者运行的过程中,编写的XAML代码很可能有错误,此时XAML代码解析器通常会抛出称为XamlParseException的异常.但是抛出的XamlParseException异常提供的信息非常简单,或者是很不准确.此时我们关于通过对变通的方法来获取更多的异常信息: 我们知道,WPF应用程序中的XAML代码是在InitializeComponent方法中解析的.而这个方法通常位于窗口对象的

WPF应用程序中的发声功能

几个星期以前,我坐在一辆崭新的丰田普锐斯汽车中,听着租车公司的销售代理讲解着仪表盘上遍布 的陌生控制开关和指示器."哇,"我想,"虽然技术和车一样都那么陈旧了,制造商仍继续美化着用 户界面". 从最广义的层面上说,用户界面是人机交互的地方.虽然这一概念与技术本身一样历史悠久,但用户 界面作为一种艺术形式大放异彩倚仗的却是个人计算机革命. 现在,恐怕只有很小一部分个人计算机用户能够记得 Apple Macintosh 和 Microsoft Windows 图形 用户

UI前沿技术 – WPF应用程序中的MIDI音乐

每一台 PC 都包含一个内置的 16 人乐队,可播放一些音乐.人们不容易注意此乐队的成员,因为它 们表示的可能是 Windows 所支持的声音和视频功能阵列中利用最不充分的组件. 此 16 人乐队是在符合 MIDI(乐器数字接口)标准的硬件或软件中实现的电子音乐合成器.在 Win32 API 中,以单词 midiOut 开头的函数支持使用 MIDI 合成器播放音乐. MIDI 支持不是 .NET Framework 的一部分,但如果要在 Windows 窗体或 Windows Presentat

在WPF的DataGrid中如果排序后再编辑单元格, 然后就不能重新绑定DataGrid?

问题描述 在WPF的DataGrid中如果排序后再编辑单元格, 然后就不能重新绑定DataGrid? 我找了很多类似的提问,都没找到答案,包括在stackoverflow. 正常的情况下,代码是可以运行的,但是一旦用户在datagrid中对某列排序了,接下来再编辑单元格也没问题,可是一旦在cellediteding事件中加入重新绑定,运行就会出错."{"在 AddNew 或 EditItem 事务过程中不允许"Sorting"."}". 我想可能

在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH

原文 在WPF的DATAGRID中快速点击出现在ADDNEW或EDITITEM事务过程不允许DEFERREFRESH 在项目中关于DataGrid的遇到过一些问题,其中是关于迁入CheckBox的双向绑定后,快速点击多次后出现"AddNew或EditItem事务过程不允许DeferRefresh"的问题,如图所示 或者是英文 原因是DataGrid编辑状态引起的,详情见http://stackoverflow.com/questions/3354916/what-is-the-prop

winform放入wpf主窗体中?

问题描述 winform放入wpf主窗体中? wpf作为主窗体有导航作用,winform是已经写好的程序.怎么把这个winform加载到wpf这个框里? 解决方案 http://jingyan.baidu.com/article/3aed632e663387701080910d.html

在后台代码中引入XAML的方法

本文将介绍三种方法用于在后台代码中动态加载XAML,其中有两种方法是加载已存在的XAML文件,一种方法是将包含XAML代码的字符串转换为WPF的对象. 这些是我在编写RegeX时获得的经验,它们将会给WPF程序带来更多的灵活性. 一.在资源字典中载入项目内嵌资源中的XAML文件 Application.Current.Resources.MergedDictionaries.Insert(0, Application.LoadComponent(new Uri("abc/Index.xaml&q

学习JAVA语言过程中可能遇到的共同问题

这节教程将讨论一些在学习JAVA语言过程中可能遇到的共同问题. 问题一:编译器找不到类. 解决方法: 确保你已经导入了类或者它的包. 如果对CLASSPATH环境变量有进行设置,要重新复位. 确保类名的拼写跟定义的一样,要注意大小写问题. 如果类在包中,要确保它们处在正确的子目录中. 同时,一些程序员从.java文件名字为类使用不同的名字.要确保你是使用类名字而不是文件名.实际上,使类名和文件名相同就不会出现这个错误了. 问题二:注释器不能找到其中一个类 解决方法: 确保你指定的是类名而不是类的

目标跟踪学习笔记_1(opencv中meanshift和camshift例子的应用)

在这一节中,主要讲目标跟踪的一个重要的算法Camshift,因为它是连续自使用的meanShift,所以这2个函数opencv中都有,且都很重要.为了让大家先达到一个感性认识.这节主要是看懂和运行opencv中给的sample并稍加修改.      Camshift函数的原型为:RotatedRect CamShift(InputArray probImage, Rect& window, TermCriteria criteria).      其中probImage为输入图像直方图的反向投影

用深度学习来解析梦境中出现的物体

这篇文章主要的工作算是机器学习和神经科学的结合工作,需要读者在这两个方向有一定的基础. 另有科普版本,结构更加清晰,不过删减了很多内容.科普版本如下: 用深度学习来解析梦境中出现的物体 - 行为与认知神经科学 (https://zhuanlan.zhihu.com/p/27948255) 机器学习简介:机器学习算法是一类从数据中自动分析获得规律,并利用规律对未知数据进行预测的算法.最近大火的深度学习则是机器学习的一个分支,主要用基于人工神经网络的各种方法来实现目的,现在有很多变种,本文中使用的神