WPF之x命名空间
“x命名空间”的x是映射XML命名空间时给它取的名字(取XAML的首字母),里面的成员(如xClass、x:Name)是专门写给XAML编译器看、用来引导XAML编译器把XAML代码编译成CLR代码的。
x命名空间内容#
x命名空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,包含的类均与解析XAML语言相关,所以亦可称之为“XAML命名空间”。x命名空间里面的类能让程序员与XAML编译器沟通,如下表所示:
名称 | 类别 |
---|---|
x:Array | 标记扩展 |
x:Class | Attribute |
x:ClassModifier | Attribute |
x:Code | XAML指令元素 |
x:FieldModifier | Attribute |
x:Key | Attribute |
x:Name | Attribute |
x:Null | 标记扩展 |
x:Shared | Attribute |
x:Property | Attribute |
x:Static | 标记扩展 |
x:Subclass | Attribute |
x:Type | 标记扩展 |
x:TypeArguments | Attribute |
x:Uid | Attribute |
x:XData | XAML指令元素 |
由上面的表可以看出,它们可以分为Attribute、标记扩展和XAML指令元素。
x命名空间的Attribute#
x:Class#
作用:为标签添加xClass=“目标类名”这样一个Attribute(x:Class这个Attribute并不是对象的成员),告诉XAML编译器将编译结果与哪个C#编译的类合并。
用法:namespace可选,classname必需。
<object x:Class="namespace.classname"...>
...
</object>
注意:x:Class只能在XAML生产的根元素上指定,对于在XAML中具有父对象的任何对象无效。
注:x:Property、x:TypeArguments、x:Uid、x:Subclass不常用,暂不介绍。
x:ClassModifier#
作用:告诉XAML编译由标签编译生成的类具有怎样的访问控制级别。
用法:
<object x:Class="namespace.classname" x:ClassModifier="NotPublic">
...
</object>
注意:必须在同一元素上提供x:Class,并且该元素必须是页面中的根元素。
x:Name#
作用:
- 告诉XAML编评器,当一个标签带有x:Name时除了为这个标签生成对应实例外还要为这个实例声明一个引用变量,变量名就是x:Name的值。
- 将XAML标签所对应对象的Name 属性(如果有)也设为x:Name的值,并把这个值过册到UI树上,以方发查找。
用法:
<object x:Name="XAMLNameValue".../>
注意:对象有Name属性时Name和x:Name是可以互换的,对象没有Name属性时只能用x:Name,全部使用x:Name以增强代码的统一性和可读性。
x:FieldModifier#
作用:使用x:Name后,XAML标签对应的实例就具有了自己的引用变量(类的字段),x:FieldModifier就是用来在XAML里改变引用变量访问级别的。
用法:
<object x:FieldModifier="Public".../>
注意:使用x:FieldModifier的前提是这个标签同时也使用x:Name,该XAML标签的根元素必须声明x:Class指令。
x:Key#
作用:唯一标识在XAML定义的字典中创建和引用的元素,x:Key在 XAML 对象元素中添加值是在资源字典中标识资源的最常见方法。
用法:
先在Window的资源字典里添加一个条目(一个字符串),在XAML中多次使用这个字符串,代码如下:
<Window x:Class="LearnWpf.MainWindow" x:ClassModifier="internal"
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"
xmlns:sys ="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="165.79" Width="232.72">
<Window.Resources>
<sys:String x:Key="myString">Hello WPF Resoureel</sys:String>
</Window.Resources>
<Grid>
<TextBox HorizontalAlignment="Left" Height="23" Margin="58,38,0,0" TextWrapping="Wrap" Text="{StaticResource myString}" VerticalAlignment="Top" Width="120"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="58,66,0,0" TextWrapping="Wrap" x:Name="textBox1" VerticalAlignment="Top" Width="120"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="58,94,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
</Grid>
</Window>
资源不但可以在XAML中访问,在C#中也可以访问,代码如下:
private void Button_Click(object sender, RoutedEventArgs e)
{
string str=this.FindResource("myString") as string;
this.textBox1.Text = str;
}
x:Shared#
作用:设置false为时,修改WPF资源检索行为,以便对属性资源的请求为每个请求创建一个新实例(默认值为true,即所有请求共享同一实例)。
用法:
<ResourceDictionary>
<object x:Shared="false".../>
</ResourceDictionary>
注意:x:Shared一定要**与x:Key配合使用。
x命名空间的标记扩展#
x:Type#
作用:当在XAML中想表达某个数据类型时就需要使用x:Type标记扩展,比如为某个类的一个属性赋值,它的值要求是一种数据类型。
用法:创建了一个Button的派生类,点击按钮时弹出一个自定义窗体MyWindow,代码如下:
<Grid>
<local:MyButton Content="Show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"/>
</Grid>
class MyButton : Button
{
public Type UserWindowType { get; set; }
protected override void OnClick()
{
base.OnClick();// 激发Click事件
Window win = Activator.CreateInstance(this.UserWindowType) as Window;
if (win != null)
{
win.ShowDialog();
}
}
}
注意:因为TypeExtension类的构造器可以接受数据类型名作为参数,所以完全可以这样写:
UserWindow Type="{x:Type local:MyWindow}"
x:Null#
作用:指定null作为XAML成员的值。
用法:如果一个属性具有默认值而我们又不需要这个默认值时就需要显式地设置nul值了,如显式地将某个实例的Style属性设置为x:Null,代码如下:
<Window.Resources>
<Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
<Setter Property="Width" Value="60"/>
<Setter Property="Height" Value="36"/>
<Setter Property="Margin" Value="5"/>
</Style>
</Window.Resources>
<Grid>
<Button Content="Button" HorizontalAlignment="Left" Margin="51,48,0,0" VerticalAlignment="Top" Width="75"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="51,89,0,0" VerticalAlignment="Top" Width="75"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="51,145,0,0" VerticalAlignment="Top" Width="75" Style="{x:Null}"/>
</Grid>
x:Array#
作用:通过x:Array的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员的类型由x:Array的Type指明。
用法:下面这个例子是把一个x:Array当作数据源(在WPF中把包含数据的对象称为数据源)向一个ListBox提供数据,代码如下:
<Grid>
<ListBox >
<ListBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>Tim</sys:String>
<sys:String>Tom</sys:String>
<sys:String>Victor</sys:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
</Grid>
注意:在XAML文档里声明一个包含数据的x:Array 实例,必须使用标签式声明才能做到。
x:Static#
作用:在XAML文档中使用数据类型的static成员,一个很常用的标记扩展。
用法:
<object property="{x:Static prefix:typeName.staticMemberName}" .../>
x命名空间的XAML指令元素#
x:Code#
作用:允许在XAML生产中放置代码。 此类代码可由编译XAML的任何XAML处理器实现进行编译,或在XAML生产环境中保留,以供以后使用(如运行时的解释)使用。
用法:建议将代码包含在CDATA中
<x:Code>
// 此处的代码格式和后台代码文件中的格式相同
</x:Code>
<!--例如-->
<x:Code>
<![CDATA[
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("x:Code代码");
}
]]>
</x:Code>
注意:
- x:Code指令元素必须是XAML生成的根元素的直接子元素。
- 必须在父根元素上提供X:Class 指令。
- 定义的所有代码必须是此分部类的成员或变量。
- 除了在分部类中嵌套类之外,不能定义其他类。
- 对分部类之外的代码实体的引用必须完全限定。
x:XData#
作用:启用XML数据岛在XAML中的放置,x:XData可以包含任意格式正确的XML。
WPF中把包含数据的对象称为数据源,用于把数据源中的数据提供给数据使用者的对象被称为数据提供者(Data Provider)。WPF类库中包含多种数据提供者,其中有一个类叫XmlDataProvider,专门用于提供XML化的数据。如果想在XAML里声明一个带有数据的XmlDataProvider 实例,那么XmlDataProvider 实例的数据就要放在x:XData标签的内容里。
用法:
<x:XData>
<elementDataRoot>
[elementData]
</elementDataRoot>
</x:XData>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!