【转】WPF XAML X名称空间详解

转自:WPF XAML X名称空间详解_郎涯技术-CSDN博客

X名称空间里面的成员(如X:Name,X:Class)都是写给XAML编译器看的、用来引导XAML编译器将XAML代码编译为CLR代码

【X名称空间里面到底都有些什么】

    x名称空间映射的是:http://schemas.microsoft.com/winfx/2006/xaml,望文生义,它包含的类均与解析XAML语言相关,所以亦称之为“XAML名称空间”。


    与C#语言一样,XAML也有自己的编译器。XAML语言被解析并编译,最终形成微软中间语言保存在程序集中。在解析和编译XAML的过程中,我们经常要告诉编译器一些重要的信息,如XAML编译的结果应该和哪个C#代码编译的结果合并、使用XAML声明的元素是public还是private访问级别等等。这些让程序员能够与XAML编译器沟通的工具就存在X:名称空间中。

    我们注意到,它分为Attribute、标签扩展、XAML指令元素三个种类。下面我们讲讲它们的具体用法:

【X名称空间中的Attribute】

    前面我们已经讲过,Attribute和Property是两个层面上的东西,Attribute是语言层面上的东西,是给编译器看的,Property是面向对象层面上的东西,是给编程逻辑看。而且一个标签中的Attribute大部分对应对象的Property。在使用XAML编程的时候,如果你想给它加一点特殊的标记来改变XAML对它的解析,这时候就需要额外的给它添加一些Attribute了。比如,你想告诉XAML编译器将哪个编译结果和那个C#编译的类合并,这时候就必须为这个标签添加X:Class  Attribute来告诉编译器。X:Class并不是对象成员,而是从X名称空间里拿出来硬贴上去的。让我们浏览一下常用的Attribute。

【x:Class】
    这个Attribute是告诉XAML编译器将XAML编译器编译的结果和后台编译结果的哪一个类进行合并

使用x:Class有以下几点要求:

这个Attribute只能用于根节点。
使用x:Class的根节点的类型要与x:Class的值所指示的一致。
x:Class的值所指示的类型在声明的时候必须使用partial关键字。
x:Class已经在剖析最简单的XAML的时候已经讲过,在这就不多讲了。

 【X:ClassModiffier】
    是告诉XAML编译器由标签编译成的类具有什么样的访问级别
 

使用这个Attribute的时候需要注意的是:
标签必须具有x:Class Attribute。
X:ClassModiffier的值必须与X:Class所指定类的访问权限一致。
X:ClassModiffier的值随后台代码编译语言的不同而有所不同。

例子:

<Window x:Class="WpfApplication4.wnd422"x:ClassModifier="internal"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="wnd422" Height="350" Width="525"/>

对应的C#代码:

/// <summary>
/// wnd422.xaml 的交互逻辑
/// </summary>
internal partial class wnd422 : Window
{public wnd422(){InitializeComponent();}

【X:Name】
    我们之前已经提过XAML是一种声明式语言,但你是否想过XAML标签声明的是什么呢?其实,XAML标签声明的是对象,一个XAML标签对应着一个对象,这个对象一般是一个控件类的实例。在.NET平台上,类是引用类型。引用类型的实例一般都是以“引用者---实例”的形式成对出现的,而且我们只能通过引用者来访问实例。当一个实例不在被任何引用者引用的时候,它将作为内存垃圾被销毁。常见的引用者是引用变量,但不是唯一的。

X:Name的作用有两个:
(1)告诉编译器,当一个标签带有x:Name时,除了为这个标签生成实例还要给这个标签声明一个引用变量,变量名就是x:Name的值。
(2)将XAML标签所对应的Name属性(如果有)也设置为x:Name值,并把这个值注册到UI树上,以方便查找。

【x:FieldModifier】
    使用了x:Name后,XAML标签对应的实例就具有了自己的引用变量,而且这些引用变量都是类的字段,既然这样就不免要关注一下它的访问级别。默认情况下这些字段的级别都被设置成了Internal。在编程的时候,有的时候需要用一个程序集里的一个窗体元素访问到另一个程序集的窗体元素,那么就需要使用x:FieldModifier来改变引用变量的访问级别
 

    因为x:FidleModifier是引用变量的访问级别,所以要配合x:Name一起使用。否则没有引用变量,何来引用变量访问级别。

例如:

<Window x:Class="WpfApplication4.wnd423"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="wnd423" Height="99" Width="438"><StackPanel><TextBox x:Name ="_txtBox" x:FieldModifier="internal"  Height="23" Text="TextBox"/><Button Content="OK" Click="Button_Click"/></StackPanel>
</Window>

对应的C#后台代码:

public partial class wnd423 : Window
{public wnd423(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){if(string.IsNullOrEmpty(_txtBox.Name)){_txtBox.Text = "No Name";}else{_txtBox.Text = _txtBox.Name;}}
}


 

【x:Key】
     最自然的检索方式莫过于”key-value“的形式了。在XAML文件中,我们可以把需要多次使用的内容提取出来放在资源字典中,需要使用的时候就用这个资源的key将这个资源检索出来。
 

    x:key的作用就是为资源贴上用于检索的索引。在WPF中,几乎每个元素都有自己的Resource属性,这个属性就是“key-value”的集合。只要把元素放进这个集合里,这个元素就成了资源字典中的一个条目。当然,为了能检索到这个条件,就必须为它添加x:Key。资源在WPF中非常重要,需要重复使用的XAML内容,如Style,各种Template和动画都需要放在资源里。
先让我们看XAML代码:

<Window x:Class="WpfApplication4.wnd425"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="wnd425" Height="152" Width="341"><Window.Resources><sys:String x:Key="myString" x:Shared="false">Hello WPF Resources</sys:String></Window.Resources><StackPanel Background="LightSlateGray"><TextBox Height="23" Text="{StaticResource ResourceKey=myString}"/><TextBox x:Name="_txtBox2" Height="23" Text="TextBox"/><Button Content="OK" Click="Button_Click"/></StackPanel></Window>


    资源不但可以在XAML中使用,也可以在C#中访问,C#中使用如下方式:

_txtBox2.Text = this.FindResource("myString") as string;


【x:Shared】
    学习x:key的时候我们已经了解到,如果把某个对象作为资源放入资源字典里后我们就可以把它们检索起来重复使用。那么每当我们检索到一个对象,我们得到的究竟是同一个对象呢,还是这个对像的一个副本呢?这就要看我们为x:Shared赋什么值了。

    x:Shared一定要与x:Key配合使用,如果x:Shared值为true,那么每次检索这个对象的时候,我们得到的都是同一个对象,反之,我们得到的就是这个对象的一个副本。默认这个值是true。也就是说我们使用的都是同一个对象。

【x名称空间下的扩展标签】
    标记扩展实际就是一些MarkupExtension类的直接或间接派生类。x名称空间中就包含一些这样的类,所以称其为x名称空间标签的标记扩展。

【x:Type】
    顾名思义,x:Type应该是一个数据类型的名称。一般情况下,我们在编程中操作的数据类型实例或者实例的引用。但有的时候我们也需要用到数据类型本身。
 

    能让程序员在编程的层面上自由的操作这些数据类型,比如在不知道具体类型的情况下创建这个类型的实例并尝试调用它的方法,.NET命名空间里还包含了名为Type的类作为所有数据类型在编程层面上的抽象。
 

    当我们想在XAML中表达某一数据类型就需要用到x:Type标记扩展。比如某个类的一个属性,它的值要求的是一个数据类型,当我们在XAML中为这个属性赋值是就需要用到x:Type。请看下面这个例子:

我们先定义一个C#的MyButton:

class MyButton : Button
{public Type UserWndType { get; set; }protected override void OnClick(){base.OnClick();Window wnd = Activator.CreateInstance(UserWndType) as Window;if (wnd != null)wnd.ShowDialog();}
};


再创建一个名为wnd425的Window

在创建一个Window:

<Window x:Class="WpfApplication4.wnd431"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local ="clr-namespace:WpfApplication4"Title="wnd431" Height="162" Width="306"> <StackPanel Background="LightSlateGray"><local:MyButton Content="OK" UserWndType="{x:Type TypeName=local:wnd425}"/></StackPanel>
</Window>

则运行结果如下:点击Ok时,弹出新的创建的wnd425的对话框。

【x:Null】
    在XAML里面表示空值就是x:Null。
 

    大部分时间我们不需要为属性附一个Null值,但如果一个属性有默认值而我们有不需要这个默认值就需要用的null值了。在WPF中,Style是按照一个特定的审美规格设置控件的各个属性,程序员可以为控件逐个设置style,也可以指定一个style目标控件类型,一旦指定了目标类型,所有的这类控件都将使用这个style----除非你显示的将某个实例的Style设置为null。
 

请看下面的事例:

<Window x:Class="WpfApplication4.wnd432"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"Title="wnd432" Height="309.231" Width="325.385"><Window.Resources><Style x:Key="{x:Type Button}" TargetType="{x:Type Button}"><Setter Property="Width" Value="60"/><Setter Property="Height" Value="36"/><Setter Property="Margin" Value="5"/></Style></Window.Resources><StackPanel Background="LightSlateGray"><Button Content="OK"/><Button Content="OK"/><Button Content="OK"/><Button Content="OK" Style="{x:Null}"/></StackPanel>
</Window>


【x:Array】
    通过它的item属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员的类型由x:Array的Type指明。下面这个例子就是把ArrayList做为数据源向一个ListBox提供数据:

由于x:Array的Items属性是只读的,所以只能通过标签声明语法添加数据值:

<Window x:Class="WpfApplication4.wnd434"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"xmlns:local="clr-namespace:WpfApplication4"Title="{x:Static local:wnd434.ShowString}" Height="300" Width="300"><ListBox Margin="5"><ListBox.ItemsSource><x:Array Type="sys:String"><sys:String>Tim</sys:String><sys:String>Tom</sys:String><sys:String>Victor</sys:String></x:Array></ListBox.ItemsSource></ListBox>
</Window>


【x:Static】
    这是一个很常用的标记扩展,它的作用是在XAML文档中使用数据类型为static的成员。因为XAML不能编写逻辑代码。所以使用x:Static访问的static成员一定是数据类型的属性和字段。

    如果一个程序需要支持国际化,一般需要把显示的字符串保存在一个资源类的Static属性中,所以支持国际化的程序UI中对x:Static的使用相当的频繁。

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


    我们之前已经在代码后置一节介绍过x:Code标签,它的作用是可以在XAML文档中编写后置的C#后台逻辑代码,这样做的好处就是不需要把XAML和C#分放在两个文档中,这样写的问题是代码不容易维护,不宜调试,一般没有人愿意这么干。
 

    x:XData是一个专用标签。WPF把包含数据的对象称为数据源,用于把数据源中的数据提供给数据使用者的对象被称做是数据提供者,WPF中包含多种数据提供者,其中一个类名叫做XmlDataProvider实例,那么XmlDataProvider实例的数据就要放在x:XData的标签内容里。

参考《深入浅出WPF》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/435757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++编绎器编绎C语言的问题

由于应用的需要&#xff0c;要在原来的C语言中加入C类&#xff0c;这时就会出现很多类型转换的错误&#xff0c;因为在C语言中默认的是强制转换的&#xff0c;而在C中不会自动强制转换&#xff0c;只能手工强制转化。所以出现错误了&#xff0c;只有一个错误一个错误的改了。我…

关于mult-xip bin的一些资料整理

一.实现multbin 1.首先修改config.bib 比如:#elif defined IMGMULTIBIN; NAME START ADDR SIZE TYPE; ----------------------------------------------------------------NK 80220000 007DE000 RAMIMAGE SHELL 809FE000 001…

x210-II WinCE启动10s,还可继续优化

为提高boot引导速度&#xff0c;&#xff0c;需支持multibin。方法如下: 1.D:\WINCE600\PLATFORM\SMDKV210\SMDKV210.bat REM For Multiple XIP (using demand paging on BINFS) set IMGMULTIXIP1 2.调整config.bib镜像大小 由于系统生成的XIPKERNEL约为3M。大于默认设置。所…

【转】DICOM医学图像处理:DICOM网络传输

背景&#xff1a; 专栏取名为DICOM医学图像处理原因是&#xff1a;博主是从医学图像处理算法研究时开始接触DICOM协议的。当初认识有局限性&#xff0c;认为DICOM只是一个简单的文件格式约定&#xff0c;简而言之&#xff0c;我当时认为DICOM协议就是扩展名为DCM文件的格式说明…

symbian c++ 开发环境Carbide.c++搭建

需要的东东&#xff1a;JDK1.3.1以上(自带了&#xff0c;不用安装)&#xff0c;SDK 2.0 以上&#xff08;CW版本&#xff09;&#xff0c;perl5.8.x carbide.c 免费版本 所以的东西都默认安装,下一步-->下一步,^_^! 现在开发用的最多的可能就是VC6了&#xff0c;听说以…

【转】9、XAML名称空间详解

转自&#xff1a;9、XAML名称空间详解 - 种花生的读书人 - 博客园 XAML命名空间 <Window xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"> </Window> xmlnshttp:…

ASP.NET中使用非托管DLL

在ASP.NET窗体页面中使用非托管的DLL&#xff0c;则该DLL的部署则成了一大麻烦事&#xff0c;你把他放在bin目录下不管用&#xff0c;网上介绍了几种解决办法&#xff0c;貌似有点繁琐&#xff0c;其实只要新建一个程序集项目来封装这个DLL中被调用的函数&#xff0c;然后在Web…

【转】Linux的.a、.so和.o文件

转自&#xff1a;Linux的.a、.so和.o文件_chlele0105的专栏-CSDN博客 在说明Linux的.a、.so和.o文件关系之前&#xff0c;先来看看windows下obj,lib,dll,exe的关系 windows下obj,lib,dll,exe的关系 lib是和dll对应的。lib是静态链接库的库文件&#xff0c;dll是动态链接库的库…

wince使用自定义字体

在wince中使用自定义字体其实很简单&#xff0c;只要将自已的字体加到你的程序中就可以使用了&#xff0c;在使用完后再将其清除掉。以wince中加使用"Georgia”字体为例&#xff1a; 在程序初始化的时候将你的字体加载进程序 AddFontResource(L"NandFlash\\Font\\Geo…

Visual Studio 2008 十大新功能

VS2005还没有最终稳定的版本&#xff0c;但是我想在微软的某个办公室&#xff0c;一个项目组正在研究发展Visual Studio 2008这个版本。我看了一下表&#xff0c;现在的时间是公元2006-3-9日&#xff0c;离微软发布VS2008版的α版还有整整18个月&#xff0c;我不知道它最终会是…

【转】linx 设备名字来由 sd sr sg st

转自&#xff1a;/dev/sr0 与/dev/cdrom_luoweifeng1989的博客-CSDN博客_/dev/sr0 一直不知道 sda sdb sr0 这些名字的前两两个字母是什么意思 > > On Tue, Nov 3, 2009 at 9:34 AM, Derek Broughton > > <derekpointerstop.ca>wrote: > > Transla…

wince6.0中文内核定制

对WinCE体积进行剪裁&#xff0c;并让WinCE支持简体中文和英文显示&#xff0c;默认显示是中文,并以下对字体选取 作详细的说明&#xff1b; 关键操作步骤: 1.先创建一个WINCE内核工程. 2.先打开目标的工程文件&#xff0c;单击“Project”菜单&#xff0c;再单击“Properties-…

java 中的堆和栈

Java把内存划分成两种&#xff1a;一种是栈内存&#xff0c;一种是堆内存。 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时&#xff0c;Java就在栈中为这个变量分配内存空间&#xff0c;当超过变量的作用域后&#…

【转】ubuntu 开机sudo启动应用程序

转自&#xff1a;ubuntu 开机sudo启动应用程序_Honhy的博客-CSDN博客_sudo 启动应用 第一步&#xff1a;创建一个脚本(run.sh)&#xff0c;我是放在桌面&#xff0c;脚本内容为: echo "hon123"|sudo -S /home/python/qt/Tools/QtCreator/bin/qtcreator exit 0 橙色的…

WinCE Emulator使用介绍

最近用了一下WinCE的模拟器&#xff0c;我做WinCE有几年了&#xff0c;从来没有用过WinCE的模拟器&#xff0c;第一次接触WinCE的时候就是一块S3C2410的板子和PB4.2的开发平台&#xff0c;然后就开始折腾&#xff0c;后来各种开发板都用过&#xff0c;WinCE也从4.2版本用到了6.…

lucene中对不同的域使用不同的分析器

在lucene使用过程中&#xff0c;如果要对同一IndexWriter中不同Document&#xff0c;不同Field中使用不同的analyzer&#xff0c;我们该如何实现呢&#xff1f; 通过对《lucene in action》的阅读&#xff0c;发现是可以解决这一问题的。lucene可以正对整个IndexWriter对象或者…

【转】Ubuntu Desktop下自动启动终端并运行脚本

转自&#xff1a;Ubuntu Desktop下自动启动终端并运行脚本 - 简书 alexubuntu19:~# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 19.04 Release: 19.04 Codename: disco alexubuntu19:~# uname -a Linux ubunt…

使用js实现换肤功能

Skin.html <html xmlns"http://www.w3.org/1999/xhtml"> <head> <meta http-equiv"Content-Type" content"text/html; charsetgb2312" /> <title>网页焕肤</title> <style type"text/css"> #main…

【转】开机出现 error:file “/boot/grub/i386-pc/normal.mod“ not found 错误提示

今天用ubuntu启动盘格式化了一个分区后&#xff0c;更改了分区顺序&#xff0c;导致找不到normal.mod文件。 现在openSUSE系统无法启动。 error:file "/boot/grub/i386-pc/normal.mod" not found grub rescue> 在网上查询了很多&#xff0c;步骤如下&#xff…

VB用API实现各种对话框(总结)(转载)

标准对话框(SmDialog) Option Explicit 定义一个全局变量,用于保存字体的各种属性 Public Type SmFontAttr FontName As String 字体名 FontSize As Integer 字体大小 FontBod As Boolean 是否黑体 FontItalic As Boolean 是否斜体 FontUnderLine …