X名称空间中的标记扩展
标记扩展实际上就是一些MarkupExtension类的直接或间接派生类。
x名称空间中就包含有一些这样的类,所以我们就称他们为x名称空间内的标记扩展。
x名称中的标记扩展又有哪些呢?
x:Type
用来操作数据类型的实例或者实例的引用,也可以操作自己本身。
示例:
首先,我们在后台创建一个WPF项目,接着添加一个WPF窗口,名称为MyWindow,向后台编写一个Button的派生类
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();
}
}
}
这个类具有一个Type类型的属性,即UserWindowType,你需要把一种数据类型当作值赋给它,同时,这个类还重写了基类的Onclick方法,判断这个类是否是窗体,如果是就显示这个窗体;
然后向页面进行布局:
<StackPanel Background="LightBlue">
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<Button Content="OK" Margin="5"/>
</StackPanel>
我们看下样式,下图:
接着来到新建默认的那个项目,向其本身添加引用自身的命名空间,名称为local,名称为自己随意取
xmlns:local="clr-namespace: WpfApp1"
注意:引用名称空间后最好去生成一下项目。
然后进行UI布局,向其添加一个StackPanel布局控件,在其中添加自定义按钮,内容为Show
<StackPanel>
<local:MyButton Content="Show" UserWindowType="{x:Type local:MyWindow}" Margin="5"/>
</StackPanel>
样式图片:
运行结果就是,点击Show会弹出MyWindow这个窗口。
x:Null
对属性赋一个空值(默认值)
例如在页面布局中我们定义了Button的Style样式,但是我有的Button却不想继承这个样式,这样我们就可以用到x:Null属性了
XAML布局:
<Window.Resources>
<Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
<Setter Property="Width" Value="60"/>
<Setter Property="Height" Value="30"/>
<Setter Property="Background" Value="Orange"/>
</Style>
</Window.Resources>
<StackPanel Background="AliceBlue">
<Button Content="One"/>
<Button Content="Two"/>
<Button Content="Three" Style="{x:Null}"/>
</StackPanel>
运行结果,如下图:
可以看出第三个样式不做改变,就是系统默认的Button样式。
x:Static
它一个很常用的标记扩展,在XAML中使用数据类型的Static成员,x:Static访问的static成员一定是数据类型的属性或者字段。
首先我们为主窗体后台添加两个static成员,一个是static字段,一个是static属性。
public static string WindowTitle = "猩猩之伙"; //窗体标题
public static string ShowText { get { return "可以撩猿"; } } //窗体内容;
然后在XAML中使用x:Static来访问这两个成员
改变窗口标题:
Title="{x:Static local:MainWindow.WindowTitle}"
改变窗口内容:
<StackPanel>
<TextBlock FontSize="32" Foreground="Aquamarine" Text="{x:Static local:MainWindow.ShowText}"/>
</StackPanel>
运行结果,如下图:
x:Array
通过它的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员类型由x:Array的Type指明
示例:添加以下命名空间的引用,把一个x:Array当作数据源向一个ListBox提供数据
xmlns:sys="clr-namespace:System;assembly=mscorlib"
接着页面布局如下:
<Grid Background="LightBlue">
<ListBox Margin="5" ItemsSource="{x:Array Type=sys:String}"/>
<ListBox Margin="5">
<ListBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>One</sys:String>
<sys:String>Two</sys:String>
<sys:String>Three</sys:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
</Grid>
页面运行结果,如下图: