“x”名称空间的成员引导XAML编译器将XAML编译成CLR代码的。“x”就XAML首字母。凡包含XAML代码的WPF程序都需要通过语句 xmlns: x="http:// schemas.microsoft.com/winfx/ 2006/xaml"
引入。此名称空间是程序员与XAML编译器沟通的工具。
x名称空间都有什么东东
x名称空间有Attribute、标记扩展和XAML指令元素组成。如下表。
名称 | 种类(XAML出现的形式) |
---|---|
x:Array,x:Null,x:Static,x:Type | 标记扩展 |
x:Code,x:XData | XAML指令元素 |
x:Key,x:Name,x:Class,x:FeildModifer | Attribute |
x:ClassModifer,x:Shared,x:TypeArgument,x:Uid | Attribute |
Attribute
Attribute:语言层面的东西, 是给编译器看的。
Property:对象上面的东西,是给编程逻辑用的。
XAML标签的Attribute大部分对应对象的Property。在XAML编程中,你想添加特殊的标记从而影响XAML编译器的解析,这时候就要添加一些Attribute了。
<window x:Class="ClassName">
<!--告诉XAML编译器将编译结果与哪个C#编译的类合并-->
</window>
x:Class
x:Class
告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。在使用时遵循以下要求:
- 只能用于根结点(如:window、UserControl)
- 使用
x:Class
的根结点的类型与x:Class的值所指示的类型保持一致 -
x:Class
所指示的类型在声明时必须用partial关键字
x:ClassModifier
x:ClassModifier
告诉XAML编译器标签编译生成类的访问级别。这个Attribute需要注意以下几点:
- 标签必须具有
x:Class
-
x:ClassModifier值与
x:Class`所指类的访问级别一致 -
x:ClassModifier
与后台代码的不同而不同,参见TypeAttributes
例:x:ClassModifier="internal"
x:Name
x:Name
给标签对象起个名子,也就是生成对象实例并为它声明一个引用变量,通过这个变量方便C#代码调用这个实例。
注意:
- 如果一个标签的对象有Name属性,为方便查找将
x:Name
与Name
赋值相同并注册在UI树上。 - Name属性WPF控件的基类属性,所有控件都有Name属性。
- 当一个对象有Name属性,使用
x:Name
和Name
等同。为提高代码统一性,统一使用x:Name
<StackPanel>
<Button x:Name="button1" Margin="5"/>
<TextBox x:Name="textBox1" Margin="5"/>
</StackPanel>
x:FeildModifier
x:FeildModifier
改变引用变量的访问级别。使用前必须通过x:Name
声明引用变量。
<Button x:Name="btn1" x:FeildModifier="public" Content="Click Me" />
x:Key
x:Key
Resource(资源)检索的索引。
<Window.Resources>
<sys:String x:Key="Hello World">Hello World!</sys:String>
</Window.Resources>
<StackPanel>
<TextBlock Text="{StaticResource ResourceKey=Hello World}"/>
</StackPanel>
x:Shared
x:Shared
和x:Key
配合使用。当x:Shared="true"
通过x:Key
检索的对象为同一个对象。如果x:Sharp="false"
通过x:Key
检索的对象是此对象的新副本。
标记扩展
标记扩展(Markup Extension)实际上就是MarkupExtension类直接或间接的派生类。
x:Type
x:Type
的值代表一个数据类型的名称。一般情况下,我们在编程中操作着数据类型的实例或是实例的引用。但有些时候我们还会用到数据类型本身。
在XAML中表达一个数据类型就要用到x:Type
。比如一个类的属性是一个数据类型,当给此类赋值时。引用一下书中的例子
首先创建一个Button
的派生类MyButton
,里面包含一个名为UserWindowType
的Type类型的属性。
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();
}
}
}
然后创建一个Window
的一个派生类MyWindow
。
<Window x:Class="SamplesForWPF.MyWindow"
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:SamplesForWPF"
mc:Ignorable="d"
Title="MyWindow" Height="150" Width="300">
<StackPanel Background="LightBlue">
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<Button Content="OK" Margin="5"/>
</StackPanel>
</Window>
最后把自定义按键MyButton
放在主窗口,并将MyWindow
赋值给MyButton.UserWindowType
。
<Window x:Class="SamplesForWPF.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:SamplesForWPF"
mc:Ignorable="d"
Title="MainWindow" Height="400" Width="400">
<StackPanel Background="LightBlue">
<local:MyButton Content="Show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"/>
</StackPanel>
</Window>
TypeExtension类的构造器支持类型名参数,所以可以写成
UserWindowType="{x:Type local:MyWindow}"
x:Null
x:Null
与C#的Null
意义相同,代表一个空值。在XAML中,如果给某个对象的属性赋一个空值,我们可以这样写
<Button Content="OK" Style="{x:Null}"/>
标记扩展的两种声明语法
常用的方法用朱{}
括起来
<Button Content="OK" Style="{x:Null}"/>
另外一种语法如下
<Button Content="OK">
<Button.Style>
<x:Null/>
</Button.Style>
</Button>
大多数情况我们都会使用第一种语法,看起不来简洁明了。有一个另外,就是x:Array
。
x:Array
x:Array
的作用就是通过它Items属性向使用者暴露一个类型已知的ArrayList。ArrayList的成员类型由x:Array
的Type属性指明。
<ListBox Margin="5" ItemsSource="{x:Array Type=sys:String}"/>
一个String类型的ArrayList作为Data Source赋给了ListBox。此时的ArrayList是一个空的,我们要通个下面的代码向Items添加数据
<ListBox Margin="5">
<ListBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>张三</sys:String>
<sys:String>李四</sys:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
在解析< x: Array>
标签 的 时候编译器会生成调用AddChild
方法的代码把< x: Array>
标签 的子元素逐个添加到x: Array
实例的Items
里。
x:Static
x:Static
是用来使用XAML文档中数据类型的静态成员。XAML不能编写逻辑代码,所以使用x:Static
访问数据类型的静态成员一定是属性和字段。引用书中的例子
public partial class MainWindow : Window
{
public static string WindowTitle = "山高月小";
public static string ShowText { get { return "水落石出"}; }
public MainWindow()
{
InitializeComponent();
}
}
然后用x:Static
访问MainWindow.ShowText
<Window x:Class="SamplesForWPF.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:SamplesForWPF"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="MainWindow" Height="400" Width="400">
<StackPanel Background="LightBlue">
<TextBlock Text="{x:Static local:MainWindow.ShowText}"/>
</StackPanel>
</Window>
运行结果
XAML指令元素
XAML指令元素只有两个,x:Code
,x:XData
。
x:Code
x:Code
作用是可以包含本应后置的C#代码。
x:XData
x:XData
是一个专用标签。数据提供者XmlDataProvider
的实例放在x:XData
内容里。
引用书中实例
x:XData
网友评论