WPF之X名称空间详解
XAM简介:
XAML是一种专门用于绘制UI的语言,借助它就可以把UI定义与运行逻辑分离开来。XAML使用标签来定义UI元素,每个标签对应.NET Framework类库中的一个控件类。通过设置标签的Attribute
,不但可以对标签对应控件对象的Property
进行赋值,还可以做一些额外的事情(如声明名称空间,指定类名等)。
为对象属性赋值的语法有如下方法:(1)使用标签的Attribute(2)使用TypeConverter
类将XAML标签的Attribute
和Property
进行映射(3)属性元素,即某个标签的一个元素(其子级标签)对应这个标签的一个属性(4)标记扩展,大多数赋值都是为属性生成一个新对象,但有时候需要把同一个对象赋值给两个对象的属性,还有的时候需要给对象的属性赋一个null值,或者将一个对象的属性依赖于其他对象的某个属性上等,当需要为对象的属性进行这些特殊类型赋值时,就需要标记扩展。
X名称空间中的Attribute
x:Class
指示XAML编译器将XAML标签的编译结果与后台代码中指定的类合并,需遵循:
- 只能用于根节点
- 使用x:class根节点的类型要与x:Class的值所指示的类型保持一致
- x:Class的值指示的类型在声明时,必须使用
partial
关键字
x:ClassModifier
的值必须与x:Class
所指示的访问控制级别一致
x:Name
XMAL这种对象声明语言只负责声明对象而不负责 为这些对象引用变量,如果需要准备一个引用变量以便在C#代码中直接访问就必须显式地告诉XAML编译器,为这个对象声明引用变量,这就是x:Name
的作用,即:
- 告诉XAML编译器,当一个标签带有
x:Name
时除了为这个标签生成对应实例外还要为这个实例声明一个引用变量,变量名就是x:Name
的值。 - 将XAML标签对于对象的Name属性(如果有)也设为x:Name的值,并把这个值注册到UI树上,以方便查找。
对于没有Name
属性的元素,为了在XAML声明时也创建引用变量以便在C#代码中访问,就只能用x:Name
,建议全部使用x:Name
以增强代码的统一性和可读性。
x:FieldModifier
使用x:Name
后,XAML标签对应的实例就具有了自己的引用变量,而且这些引用变量都是类的字段。默认情况下,这些字段的访问级别按照面向对象的封装原则被设置为internal
。在编程的时候,有时候我们需要从一个程序集访问另一个程序集窗体的元素,这时候就需要把被访问空间的引用变量改为public
。
需要注意的是:因为x:FieldModifier是用来改变引用变量访问级别的,所以使用x:FieldModifier的前提是这个标签也同时使用x:Name
x:Key
在XAML文件中,我们可以把很多需要多次使用的内容提取出来放在资源字典中,需要使用的时候就用它的key检索出来。
<Window.Resources>
<sys:String x:Key="myString">Hello WPF</sys:String>
</Window.Resources>
<StackPanel Background="Gray">
<TextBox Text="{StaticResource ResourceKey=myString}" Margin="5"></TextBox>
<TextBox x:Name="textBox1" Margin="5"></TextBox>
<Button Content="Show" Click="Button_Click" Margin="5"></Button>
</StackPanel>
private void Button_Click(object sender, RoutedEventArgs e)
{
string str = this.FindResource("myString") as string; // FindResource返回object类型
this.textBox1.Text = str;
}
x:Shared
x:Key是把某些对象当作资源放进资源字典里,但每当它们检索到一个对象,我们得到的究竟是同一个对象还是这个对象的副本?这就由x:Shared
决定,它一定要与x:Key
配合使用,XAML默认x:Shared=true
,也就是说,默认情况下,我们得到的都是同一个对象。
x名称空间中的标记扩展
标记扩展实际上是一些MarkupExtension
类的直接或间接派生类,x名称空间中就包含有这样一些的类,所以常称它们为x名称空间的标记扩展。
x:Type
x:Type
在XAML中表达数据类型时就需要使用x:Type
标记扩展,比如某个类的属性,它的值要求是一种数据类型,当在XAML中为这个属性赋值时候,就要使用x:Type
。
//在MainWindow.xaml.cs中创建一个Button派生类
public class MyButton : Button
{
public Type UserWindowType { get; set; }
protected override void OnClick()
{
base.OnClick();
Window win = Activator.CreateInstance(this.UserWindowType) as Window;
if (win != null)
{
win.ShowDialog();
}
}
在项目中添加名为MyWindow
的Window
类型:
<StackPanel Background="LightBlue">
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<Button Content="OK" Margin="5"/>
</StackPanel>
最后,把自定义按钮添加到主窗口的界面上,并把MyWIndow
作为一种数据类型赋值给MyButton.UserWindowType
属性。
<StackPanel>
<local:MyButton Content="Show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5">
</local:MyButton>
</StackPanel>
可见,对于UserWindowType
属性的赋值,需要其数据类型,所以必须在标记扩展中加上x:Type
。
而对于标记扩展的语法,因为TypeExtension
类的构造器可以接受数据类型名为其参数,所以可以简写为:
UserWindowType="{x:Type local:MyWindow}"
x:Null
在XAML中用来表示空值的是x:Null
.
<Window.Resources>
<Style TargetType="Button">
<Setter Property="Width" Value="60"/>
<Setter Property="Height" Value="36"/>
<Setter Property="Margin" Value="5"/>
</Style>
</Window.Resources>
<StackPanel>
<Button Content="OK"/>
<Button Content="OK"/>
<Button Content="Ok" Style="{x:Null}"/>
</StackPanel>
其中,
<Style TargetType="Button">
</Style>
可以也可以写成
<Style TargetType="{x:Type Button}">
</Style>
标记扩展实例的两种声明语法
由于标记扩展也是标准的.NET类,所以完全也可以使用XAML标签来声明标记扩展的实例,比如上面的Button
Style
可以这样写:
<Button Content="Ok">
<Button.Style>
<x:Null/>
</Button.Style>
</Button>
x:Array
一下例子是把一个x:Array
的实例作为数据源提供给一个ListBox
:
<Grid Background="LightBlue">
<ListBox Margin="5">
<ListBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>Tim</sys:String>
<sys:String>John</sys:String>
<sys:String>Victor</sys:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
</Grid>
必须以属性元素标签声明语法,而不能用标记扩展语法,因为如果是
ItemsSource="{x:Array Type=sys:String Items=XXXXX}"
是非法的,因为ArrayExtension
的Items属性是只读的。
x:XData
x:XData
标签是一个专用标签。WPF中把包含数据的对象称为数据源,用于把数据源中的数据提供给使用者的对象称为数据提供者。WPF类库中包含有多种数据提供者,其中有一个类叫XmlDataProvider
,专门用于提供XML化的数据。如果想在XAML里声明一个带有数据的XmlDataProvider
实例,那么XmlDataProvider
实例化的数据就要放在x:XData
标签的内容里。
<Window.Resources>
<XmlDataProvider x:Key="InvertoryData" XPath="Inventory/Books">
<x:XData>
<Supermarket xmlns="">
<Fruits>
<Fruit Name="peach"/>
<Fruit Name="Banana"/>
</Fruits>
</Supermarket>
</x:XData>
</XmlDataProvider>
</Window.Resources>
WPF之X名称空间详解的更多相关文章
- WPF 基础 - x 名称空间详解
名称 种类(默认Attribute) 备注 x:Array 标记拓展 可作为 ListBox.ItemsSource 的值 x:Class 指定与 .cs 中哪个类合并,所指示的类型在声明时使用 pa ...
- 深入浅出WPF-04.x名称空间详解
x名称空间详解 几个需要特别说明的名称空间: x:Class 用来标记XAML和后台代码之间的合并关系.x:Class根节点的类型必须和x:Class值指向的类型保持一致.x:Class的值指向的类型 ...
- WPF读书笔记 x名称空间详解(第二天)
每天看一点,每天进步一点. x名称空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,它包含的类均与解析XAML语言关,亦可称为"XAML名 ...
- [No000013F]WPF学习之X名称空间详解
X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的.用来引导XAML代码将XAML代码编译为CLR代码. 4.1X名称空间里面到底都有些什么? x名称空间映射的是:htt ...
- WPF学习之X名称空间详解
X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的.用来引导XAML代码将XAML代码编译为CLR代码. 4.1X名称空间里面到底都有些什么? x名称空间映射的是:htt ...
- 9、XAML名称空间详解
XAML命名空间 <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ...
- WPF之X名称空间学习
WPF的X名称空间都有什么呢?首先,盗用张图来说明: 我将就图表中的内容进行总结: 1.x:Array具有一个Iteams属性,它能暴漏一个ArratList实例,ArratList实例的内部成员类型 ...
- Oracle表空间详解
Oracle表空间详解 1.表空间的分类 Oracle数据库把表空间分为两类:系统表空间和非系统表空间. 1.1系统表空间指的是数据库系统创建时需要的表空间,这些表空间在数据库创建时自动创建,是每个数 ...
- ORACLE结构体系篇之表空间详解.md
表空间详解一.系统表空间SYSTEM 表空间是Oracle 数据库最重要的一个表空间,存放了一些DDL 语言产生的信息以及PL/SQL 包.视图.函数.过程等,称之为数据字典,因此该表空间也具有其特殊 ...
- WAL日志文件名称格式详解
转自:http://blog.osdba.net/534.html WAL日志文件名称格式详解 PostgreSQL的WAL日志文件在pg_xlog目录下,一般情况下,每个文件为16M大小: osdb ...
随机推荐
- Typescript通用帮助类,格式化日期时间等
/** * 格式化日期选项 */ export class DateFormatOption { "M+": number;//月 "d+": number;/ ...
- C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
前言 自从 DeepSeek 大模型火了以来,网络上出现了许多关于本地部署的教程和方法.然而,要真正深入了解其功能和应用,还是需要自己动手进行一次本地部署. DeepSeek 作为一个高效的自然语言处 ...
- Typecho 从零开始搭建个人博客详细教程
搭建Typecho个人博客需要进行一些准备工作.以下是大致的教学步骤: 1. 准备工作: - 一台支持PHP和MySQL的服务器,可以是虚拟主机或者自己搭建的服务器. - 一个域名,用于访 ...
- 基于正则化的图自编码器在推荐算法中的应用 Application of graph auto-encoders based on regularization in recommendation algorithms
引言 看过的每一篇文章,都是对自己的提高.不积跬步无以至千里,不积小流无以成江海,积少成多,做更好的自己. 本文基于2023年4月6日发表于SCIPEERJ COMPUTER SCIENCE(PEER ...
- ascci 码表
- uniapp 截屏扫码
最近开发功能遇到个需求,用户点击某个操作之后,需要截取当前屏幕内容,并扫码识别屏幕截图中的二维码,代码如下: 首先将代码抽离到外部文件中,以便复用: // 截图 export function tak ...
- JetBrains goland、pycharm、webstorm、phpstorm 对比两文件内容是否一致
对比文件 JetBrains goland.pycharm.webstorm.phpstorm 对比两文件内容是否一致 第一种 打开文件,按住键盘上的CTRL键,然后鼠标右键,点击菜单中的" ...
- laravel-echo-server 启动报错 [ioredis] Unhandled error event: ReplyError: NOAUTH Authentication required.
可以在 .env 文件加上以下配置 LARAVEL_ECHO_SERVER_REDIS_HOST= LARAVEL_ECHO_SERVER_REDIS_PASSWORD= LARAVEL_ECHO_S ...
- useSyncExternalStore 的应用
我们是袋鼠云数栈 UED 团队,致力于打造优秀的一站式数据中台产品.我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值. 本文作者:修能 学而不思则罔,思而不学则殆 . --- <论语 ...
- 在Linux中查看分区表的4种方法
作为Linux管理员,我们需要一次又一次地查看硬盘的分区表.这有助于我们通过为进一步分区腾出空间来重新组织旧驱动器,并在必要时为新驱动器创建空间.您可以在硬盘上创建不超过四个主分区,但可以在多个逻辑分 ...