深入浅出WPF笔记——X名称空间详解

引用地址:深入浅出WPF笔记——X名称空间详解_wpf x:name-CSDN博客

 

 

 

深入浅出WPF笔记——X名称空间详解

“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:XDataXAML指令元素
x:Key,x:Name,x:Class,x:FeildModiferAttribute
x:ClassModifer,x:Shared,x:TypeArgument,x:UidAttribute

Attribute

Attribute:语言层面的东西, 是给编译器看的。
Property:对象上面的东西,是给编程逻辑用的。
XAML标签的Attribute大部分对应对象的Property。在XAML编程中,你想添加特殊的标记从而影响XAML编译器的解析,这时候就要添加一些Attribute了。

 
  1. <window x:Class="ClassName">

  2. <!--告诉XAML编译器将编译结果与哪个C#编译的类合并-->

  3. </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:NameName赋值相同并注册在UI树上。
  • Name属性WPF控件的基类属性,所有控件都有Name属性。
  • 当一个对象有Name属性,使用x:NameName等同。为提高代码统一性,统一使用x:Name
 
  1. <StackPanel>

  2. <Button x:Name="button1" Margin="5"/>

  3. <TextBox x:Name="textBox1" Margin="5"/>

  4. </StackPanel>

x:FeildModifier

x:FeildModifier改变引用变量的访问级别。使用前必须通过x:Name声明引用变量。

<Button x:Name="btn1" x:FeildModifier="public" Content="Click Me" />
x:Key

x:KeyResource(资源)检索的索引。

 
  1. <Window.Resources>

  2. <sys:String x:Key="Hello World">Hello World!</sys:String>

  3. </Window.Resources>

  4. <StackPanel>

  5. <TextBlock Text="{StaticResource ResourceKey=Hello World}"/>

  6. </StackPanel>

x:Shared

x:Sharedx: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类型的属性。

 
  1. public class MyButton : Button

  2. {

  3. public Type UserWindowType { get; set; }

  4. protected override void OnClick()

  5. {

  6. base.OnClick();

  7. Window win = Activator.CreateInstance(this.UserWindowType) as Window;

  8. if (win != null)

  9. {

  10. win.ShowDialog();

  11. }

  12. }

  13. }

然后创建一个Window的一个派生类MyWindow

 
  1. <Window x:Class="SamplesForWPF.MyWindow"

  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

  6. xmlns:local="clr-namespace:SamplesForWPF"

  7. mc:Ignorable="d"

  8. Title="MyWindow" Height="150" Width="300">

  9. <StackPanel Background="LightBlue">

  10. <TextBox Margin="5"/>

  11. <TextBox Margin="5"/>

  12. <TextBox Margin="5"/>

  13. <Button Content="OK" Margin="5"/>

  14. </StackPanel>

  15. </Window>

最后把自定义按键MyButton放在主窗口,并将MyWindow赋值给MyButton.UserWindowType

 
  1. <Window x:Class="SamplesForWPF.MainWindow"

  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

  6. xmlns:local="clr-namespace:SamplesForWPF"

  7. mc:Ignorable="d"

  8. Title="MainWindow" Height="400" Width="400">

  9. <StackPanel Background="LightBlue">

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

  11. </StackPanel>

  12. </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}"/>

另外一种语法如下

 
  1. <Button Content="OK">

  2. <Button.Style>

  3. <x:Null/>

  4. </Button.Style>

  5. </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添加数据

 
  1. <ListBox Margin="5">

  2. <ListBox.ItemsSource>

  3. <x:Array Type="sys:String">

  4. <sys:String>张三</sys:String>

  5. <sys:String>李四</sys:String>

  6. </x:Array>

  7. </ListBox.ItemsSource>

  8. </ListBox>

在解析< x: Array>标签 的 时候编译器会生成调用AddChild方法的代码把< x: Array>标签 的子元素逐个添加到x: Array实例的Items里。

x:Static

x:Static是用来使用XAML文档中数据类型的静态成员。XAML不能编写逻辑代码,所以使用x:Static访问数据类型的静态成员一定是属性字段。引用书中的例子

 
  1. public partial class MainWindow : Window

  2. {

  3. public static string WindowTitle = "山高月小";

  4. public static string ShowText { get { return "水落石出"}; }

  5. public MainWindow()

  6. {

  7. InitializeComponent();

  8. }

  9. }

然后用x:Static访问MainWindow.ShowText

 
  1. <Window x:Class="SamplesForWPF.MainWindow"

  2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

  3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

  6. xmlns:local="clr-namespace:SamplesForWPF"

  7. xmlns:sys="clr-namespace:System;assembly=mscorlib"

  8. mc:Ignorable="d"

  9. Title="MainWindow" Height="400" Width="400">

  10. <StackPanel Background="LightBlue">

  11. <TextBlock Text="{x:Static local:MainWindow.ShowText}"/>

  12. </StackPanel>

  13. </Window>

运行结果

XAML指令元素

XAML指令元素只有两个,x:Code,x:XData

x:Code

x:Code作用是可以包含本应后置的C#代码。

x:XData

x:XData是一个专用标签。数据提供者XmlDataProvider的实例放在x:XData内容里。

引用书中实例

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值