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>

我们看下样式,下图:

X名称空间中的标记扩展

接着来到新建默认的那个项目,向其本身添加引用自身的命名空间,名称为local,名称为自己随意取

xmlns:local="clr-namespace: WpfApp1"

注意:引用名称空间后最好去生成一下项目。

然后进行UI布局,向其添加一个StackPanel布局控件,在其中添加自定义按钮,内容为Show

<StackPanel>

        <local:MyButton Content="Show" UserWindowType="{x:Type local:MyWindow}" Margin="5"/>

 </StackPanel>

样式图片:

X名称空间中的标记扩展

运行结果就是,点击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>

运行结果,如下图:

X名称空间中的标记扩展

可以看出第三个样式不做改变,就是系统默认的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名称空间中的标记扩展

 

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>

页面运行结果,如下图:

X名称空间中的标记扩展