x名称空间中的标记拓展

 1.x:Type

 Type类可作为所有数据类型在编程层面上的抽象。在XAML中,如果想表达某个数据类型时就需要使用x:Type标记拓展。例子:

创建一个Button的派生类:

x名称空间中的标记拓展
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace WpfApplication3
{
    class MyButton:Button
    {
        public Type UserWindowType { get; set; }
        protected override void OnClick()//是protected,不是public
        {
            base.OnClick();//激发Click事件
            Window win = Activator.CreateInstance(this.UserWindowType) as Window;
            if (win != null)
            {
                win.ShowDialog();
            }
        }
    }
}
View Code

 

添加一个MyWindow:

x名称空间中的标记拓展
<Window x:Class="WpfApplication3.MyWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        WindowStartupLocation="CenterScreen"
        Title="MyWindow" Height="170" Width="200">
    <Grid>
        <StackPanel Background="LightBlue">
            <TextBox Margin="5"></TextBox>
            <TextBox Margin="5"></TextBox>
            <TextBox Margin="5"></TextBox>
            <Button Content="OK" Margin="5"></Button>
        </StackPanel>
    </Grid>
</Window>
View Code

 

再编写MainWindow:

x名称空间中的标记拓展
<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication3"
        WindowStartupLocation="CenterScreen"
        Title="MainWindow" Height="300" Width="300">
    <!--xmlns:local="clr-namespace:WpfApplication3"引入命名空间WpfApplication3,并映射为local-->
    <Grid>
        <StackPanel>
            <local:MyButton Content="Show" UserWindowType="{x:Type TypeName=local:MyWindow}" Margin="5"></local:MyButton>
        </StackPanel>
    </Grid>
</Window>
View Code

 

2.x:Null

显示地对一个属性赋一个空值

例子:

MainWindow:

x名称空间中的标记拓展
<Window x:Class="xNull.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="x:Null Sample" Height="300" Width="300">
    <Window.Resources>
        <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}">
            <Setter Property="Width" Value="60"></Setter>
            <Setter Property="Height" Value="36"></Setter>
            <Setter Property="Margin" Value="5"></Setter>
        </Style><!--设置Button控件的默认Style-->
    </Window.Resources>
    <Grid>
        <StackPanel>
            <Button Content="0K"></Button>
            <Button Content="0K"></Button>
            <Button Content="0K"></Button>
            <Button Content="OK" Style="{x:Null}"></Button><!--显示地把Style设置为x:Null了-->
        </StackPanel>
    </Grid>
</Window>
View Code

 

效果:

x名称空间中的标记拓展 

 

3.标记扩展实例的两种声明语法

 上面的例子,可以写成:

<Button Content="OK">
    <Button.Style>
        <x:Null />
    </Button.Style>
</Button>

 

这样写,代码显得有些啰嗦,所以为了保持简洁,很少使用这样的写法 

 

4.x:Array

 x:Array的作用就是通过它的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员的类型由x:Array的Type指明

例子:

x名称空间中的标记拓展
<Window x:Class="xArray.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="120" Width="160">
    <!--需要使用String,引入xmlns:sys="clr-namespace:System;assembly=mscorlib"-->
    <Grid>
        <Grid Background="LightBlue">
            <ListBox Margin="5" ItemsSource=“{x:Array Type=sys:String}”><!--类型为String-->
            </ListBox>
        </Grid>
    </Grid>
</Window>
View Code

 

但如果这样写,是没有数据可以提供的,则改为标签声明语法:

x名称空间中的标记拓展
<Window x:Class="xArray.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="120" Width="160">
    <!--需要使用String,引入xmlns:sys="clr-namespace:System;assembly=mscorlib"-->
    <Grid>
        <Grid Background="LightBlue">
            <ListBox Margin="5">
                <ListBox.ItemsSource>
                    <x:Array Type="sys:String"><!--类型为String-->
                        <sys:String>Tim</sys:String>
                        <sys:String>Tom</sys:String>
                        <sys:String>Victor</sys:String>
                    </x:Array>
                </ListBox.ItemsSource>
            </ListBox>
        </Grid>
    </Grid>
</Window>
View Code

结果为:

x名称空间中的标记拓展

 

 5.x:Static

 在XAML文档中使用数据类型的Static成员

例子:

MainWindow.xaml.cs:

x名称空间中的标记拓展
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace xStatic
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public static string WindowTitle = "高山流水";
        public static string ShowText { get { return "水落石出"; } }

        public MainWindow()
        {
            InitializeComponent();
        }
    }
}
View Code

 

 

MainWindow.xaml

x名称空间中的标记拓展
<Window x:Class="xStatic.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:xStatic"
        Title="{x:Static local:MainWindow.WindowTitle}" Height="120" Width="300">
    <!--把命名空间xStatic映射为local-->
    <!--使用x:Static访问静态成员数据-->
    <Grid>
        <StackPanel>
            <TextBox FontSize="32" Text="{x:Static local:MainWindow.ShowText}"></TextBox>
            <!--使用x:Static访问静态成员数据-->
        </StackPanel>
    </Grid>
</Window>
View Code

 

 结果:

x名称空间中的标记拓展

 

6.XAML指令元素

 XAML指令元素有两个:

x:Code

x:XData

1)x:Code的作用是,放置一些本应该放在后置代码中的C#代码。一般不会这样做,这样做,会是代码难以维护、不易于调试

2)x:XData是一个专用标签。如果想在XAML中声明一个带有数据的XmlDataProvider实例,那么XmlDataProvider实例的数据就应该放在x:Data标签的内容里,比如:

x名称空间中的标记拓展
<Window.Resources>
    <XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
        <x:XData>
            <Supermarket xmlns="">
               <Fruits>
                  <Fruit Name="Peach"/>
                  <Fruit Name="Banana"/>
                  <Fruit Name="Orange"/>
               </Fruits>
               <Drinks>
                  <Drink Name="Coca Cola"/>
                  <Drink Name="PEPSI Cola"/>
               </Drinks>
            </Supermarket>    
        </x:XData>
    </XmlDataProvider>
</Window.Resources>
x名称空间中的标记拓展

x名称空间中的标记拓展

上一篇:Replication的犄角旮旯(二)--寻找订阅端丢失的记录


下一篇:浅谈面向对象思想