转自:9、XAML名称空间详解 - 种花生的读书人 - 博客园
XAML命名空间
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> </Window> xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation命名空间映射许多当前*.xaml文件使用的WPF.NET命名空间。这个一对多的映射其实使用程序集级别的 [XmlnsDefinition]特性硬编码在WPF程序集中。例如导入System.Windows命名空间: [asembly:XmlnsDefinition(“http://schemas.microsoft.com/winfx/2006/xaml/presentation”)]
另外可以使用clr-namespace和assembly标记建立一个自定义的XML命名空间,使其映射到自定义库。 xmlns:myCtrls="clr-namespace:MyControls;assembly=MyControls"
X名称空间里的成员(如X:Class、X:Name)是专门写给XAML编译器看、用来引导XAML编译器把XAML代码编译成CLR代码的。
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4.2x名称空间中的Attribute
4.2.1x:Class的作用是告诉XAML编译器将XAML标签的编译结果与后台中的指定类合并,使用x:Class时必须遵循以下要求:
*这个Attribute只能用于根结点
*使用x:Class的根结点的类型要与x:Class的值所指示的类型保持一致
*x:Class的值所指示的类型在声明时必须使用partial关键字
<Window x:Class="将窗体设为透明1.MainWindow" 根结点
public partial class MainWindow : Window 保持一致 partial关键字 4.2.3x:Name XAML的标签声明的是对象,一个XAML标签对应一个对象,这个对象一般是一个空间类的实例。 x:Name的作用有两个:(1)告诉XAML编译器,当一个标签带有x:Name时除了为这个标签生成对应的实例外还要为这个实例声明一个引用变量, 这个变量名就是x:Name的值(2)将XAML标签所对应的对象的Name属性也设置为x:Name的值,并把这个值注册到UI树上,以方便查找。 使用x:Name后,XAML标签对应的实例就具有了自己的引用变量,而且这些引用变量都是类的字段。
<Grid> <TextBox Width="100" Margin="5" HorizontalAlignment="Left" VerticalAlignment="Top" /> <Button Margin="5" HorizontalAlignment="Right" VerticalAlignment="Bottom" Click="Button_Click" Content="OK" /> </Grid>
private void Button_Click(object sender, RoutedEventArgs e) { Grid grid1 = this.Content as Grid;//MainWindow.Content属性引用着Grid的实例,而Grid的实例的Children[0]又引用着TextBox的实例 TextBox textBox = grid1.Children[0] as TextBox; if (string.IsNullOrEmpty(textBox.Text)) { textBox.Text = "hello"; } else { textBox.Text = textBox.Name; } }
代码简写过程
<StackPanel Background="Gray"> <StackPanel.Children><!--可以简写掉,后台可通过Children属性遍历控件--> <TextBox Margin="5"/> <TextBox Margin="5"/> <Button Margin="5"/> </StackPanel.Children> </StackPanel> 4.2.4 x:FieldModifier:用来改变引用变量的访问级别
<TextBox Margin="5" x:FieldModifier="public" /> <TextBox Margin="5" x:FieldModifier="private" />
4.2.5 x:Key x:Key的作用就是为资源贴上用于检索的索引,在WPF中几乎每个元素都有自己的Resource属性, 这个属性是个“Key-Value”式的集合, 只要把元素 放进这个集合,这个元素就成为资源字典中的一个条目。
<Window.Resources> <sys:String x:Key="myString">Hello WPF</sys:String> </Window.Resources> 在XAML中访问资源<TextBox Margin="5" Text="{StaticResource ResourceKey=myString}" />
在C#中访问资源 private void Button_Click_1(object sender, RoutedEventArgs e) { string str = this.FindResource("myString") as string; this.textBox2.Text = str; } 4.2.6 x:Shared:在学习x:Key时我们知道一旦我们把某些对象当作资源放进资源字典里后就可以把它检索出来重复使用, 那么,每当我们检索到一 个对象的时候,到底得到的是同一个对象,还是对象的副本呢?这就要看我们给x:Shared赋什么值了。 x:Shared一定要与x:Key配合使用, 如果x:Shared的值为true,那么得到的是同一个对象,否则x:Shared的值为false, 得到的是这个对象的一个副本。默认情况下,XAML编译器会 为资源隐藏地添加x:Shared=“true”, 也就是说,默认情况下我们得到的都是同一个对象。 4.3 x名称空间中的标记扩展 4.3.1 x:Type:其值是一个数据类型的名称
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(); } } }
<StackPanel Background="Gray"> <StackPanel.Children> <!-- 可以简写掉,后台可通过Children属性遍历控件 --> <TextBox Margin="5" Text="{StaticResource ResourceKey=myString}" /> <TextBox x:Name="textBox2" Margin="5" /> <!-- <Button Margin="5" Click="Button_Click_1" /> --> <Button Content="OK" /> </StackPanel.Children> </StackPanel>
<Window x:Class="_4._2.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:_4._2" Title="Window1" Width="300" Height="300"> <Grid> <local:MyButton Margin="5" Content="Show" UserWindowType="{x:Type TypeName=local:MainWindow}" /> </Grid> </Window>
4.3.2 x:Null:显式地对一个属性赋一个空值,在C#语言中null表示空值,在XAML里x:Null表示空值
<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> <Button Content="OK"/> <Button Content="OK"/> <Button Content="OK"/> <Button Content="OK" Style="{x:Null}"/> </StackPanel>
<Button Content="Hello"> <Button.Style> <x:Null/> </Button.Style> </Button>
4.3.4 x:Array作用就是通过它的Items属性向使用者暴露一个类型已知的ArrayList实例,ArrayList内成员的类型由x:Array的Type指明。
<ListBox Margin="5"> <ListBox.ItemsSource> <x:Array Type="sys:String"> <sys:String>Trim</sys:String> <sys:String>Tom</sys:String> <sys:String>Vitor</sys:String> </x:Array> </ListBox.ItemsSource> </ListBox> 4.3.5 x:Static 是在XAML文档中使用数据类型的static成员,因为在XAML中不能写逻辑代码
public static string WindowTitle = "山高水长"; public static string ShowText { get { return "水落石出"; } }
xmlns:local="clr-namespace:统一设置一组控件的样式"
<TextBlock Text="{x:Static local:MainWindow.ShowText}"/>
4.4 XAML指令元素
x:Code 作用就是可以包含一些本应放置在后置代码中的C#代码,,好处是代码在同一个文件中,不好的地方是不便于以后的扩展 x:XData 把包含数据的对象成为数据源,用于把数据源中的数据提供给数据使用者的对象被称为数据提供者(Data Provider)
<Window.Resources> <XmlDataProvider x:Key="MyData" XPath="Properties/Fruits"> <x:XData> <Supermarket xmlns=""> <Fruit> <Fruit Name="Peach"/> <Fruit Name="Banana"/> <Fruit Name="Orangle"/> </Fruit> <Drinks> <Drink Name="Coca Cola"/> <Drink Name="PEPSI Cola"/> </Drinks> </Supermarket> </x:XData> </XmlDataProvider> </Window.Resources>