《深入浅出WPF》4.0x名称空间
4.1 x名称空间
定义:映射到XML名称空间的取名
作用:引导XAML编译器将XAML代码编译为CLR代码,XAML代码都需要引用此空间
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x名空间包含的工具
分类为:Attribute、标签扩展、XAML指令元素
名称 | 种类(在XAML中出现的形式) |
---|---|
x:Array | 标签扩展 |
x:Class | Attribute |
x:ClassModifier | Attribute |
x:Code | XAML指令元素 |
x:FileModifier | Attribute |
x:Key | Attribute |
x:Name | Attribute |
x:NULL | 标签扩展 |
x:Shared | Attribute |
x:Static | 标签扩展 |
x:SubClass | Attribute |
x:Type | 标签扩展 |
x:TypeArguements | Attribute |
x:Uid | Attribute |
x:XData | XAML指令元素 |
4.2 x名称空间的Attribute
Attribute和Property区别:Attribute 是语言层面的,给编译器看的,Property面向对象,给编程逻辑看的
4.2.1 x:Class 合并类
作用:这个Attribute是将XAML编译出的结果和与后台代码中指定的类合并
x:Class="WpfAppTest3.MainWindow"
## 注意
* 这个Attribute只能用于根节点
* 使用x:Class 的根节点类型要与x:Class所指定的根节点类型一致
* x:Class所指示的类型在声明的时候必须使用partial关键字
4.2.2 x:ClassModifier Class访问级别
x:ClassModifier :Attribute 告诉XAML编译器由标签生成的类的访问级别。
## 注意事项
* 标签必须有x:Class Attribute
* x:ClassModifier的访问级别必须与x:class所指定的类的访问级别一致
* x:ClassModifier 的值随着后台代码的语言类型的不同而不同
//C#
internal partial class MainWindow : Window
<!--XAML中-->
<x:ClassModifier="internal"/>
4.2.3 x:Name
XAML标签声明的是对象
通过层级索引
<Window x:Class="WpfApp1XName.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1XName"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<TextBox Margin="5"/>
<Button Content="OK" Margin="5" Click="Button_Click"/>
</StackPanel>
</Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
StackPanel stackPanel = this.Content as StackPanel;
TextBox textBox = stackPanel.Children[0] as TextBox;
if (string.IsNullOrEmpty(textBox.Name))
{
textBox.Text = "No Name";
}
else
{
textBox.Text = textBox.Name;
}
}
x:Name作用1:告诉XAML编译器,为实例声明一个引用变量,引用变量的名称就是x:Name的值
x:Name作用2:将XAML标签的Name属性(如果有)也设置为x:Name的值,并把这个值注册到UI树上,方便查找
通过X:Name索引
<StackPanel>
<TextBox x:Name="textbox1" Margin="5"/>
<Button Content="OK" Margin="5" Click="Button_Click"/>
</StackPanel>
private void Button_Click(object sender, RoutedEventArgs e)
{
if (string.IsNullOrEmpty(this.textbox1.Name))
{
this.textbox1.Text = "No Name";
}
else
{
this.textbox1.Text = this.textbox1.Name;
}
}
## 注意
* Name属性定义在FrameWorkElement类中,这个类是WPF控件的基类,所有WPF控件都有Name属性
* x:Name的功能涵盖Name的功能
4.2.4 x:FiledModifier 变量访问级别
x:FiledModifier 设置变量的访问级别,默认下变量的访问级别是internal
<TextBox x:Name="textbox2" Margin="5" Text="FiledModifier" x:FieldModifier="public"/>
## 注意
* 使用x:FiledModifier设置属性时必须使用x:Name定义变量名
4.2.5 x:Key 检索资源关键字
作用:使用Key检索资源字典,检索资源
资源:Resources,需要重复使用的XAML的内容,可以放置style、Template、动画等。
key 定义资源:
<Window.Resources>
<sys:String x:Key="myString">Hello Wpf Resources!</sys:String>
</Window.Resources>
调用资源:
<TextBox Text="{StaticResource ResourceKey=myString}" Margin="5"/>
string str = this.FindResource("myString") as string;
整体代码:
<Window x:Class="WpfApp1XName.Window2Key"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:local="clr-namespace:WpfApp1XName"
mc:Ignorable="d"
Title="Window2Key" Height="450" Width="800">
<Window.Resources>
<sys:String x:Key="myString">Hello Wpf Resources!</sys:String>
<sys:Double x:Key="DoubleValue1">2</sys:Double>
</Window.Resources>
<StackPanel>
<TextBox Text="{StaticResource ResourceKey=myString}" Margin="5"/>
<TextBox x:Name="textbox1" Margin="5"/>
<Button Content="Show" Click="Button_Click" Margin="5"/>
<Slider Value="{StaticResource ResourceKey=DoubleValue1}"/>
</StackPanel>
</Window>
private void Button_Click(object sender, RoutedEventArgs e)
{
string str = this.FindResource("myString") as string;
this.textbox1.Text = str;
}
4.2.6 x:Shared 资源属性
定义:配合Key 使用,设置引用资源时是引用资源的同一个对象还是引用对象的副本。
设置为TRUE时,代表使用的是同一个对象,默认设置为TRUE。
设置为FALSE 时,代表使用的是副本,代表每次检索到这个对象时,我们得到的都是这个对象的副本。
4.3 x名称空间的标记扩展
标记扩展(Markup Extension)是MarkupExtension类的直接或间接派生类
4.3.1 x:Type 数据类型名称
x:Type : 值为数据类型的名称,可以赋值类,枚举,结构。
类、结构、枚举都是数据类型(Type)
Type进行实例化,使用Activator.CreateInstance函数实例化Type数据类型
Window win = Activator.CreateInstance(this.UserWindowType) as Window;
Type 赋值
<!--赋值语句 -->
<local:MyButton UserWindowType="{x:Type TypeName=local:MyWindow1}" Margin="5"/>
<local:MyButton UserWindowType="{x:Type local:MyWindow1}" Margin="5"/>
Window1
<Window x:Class="WpfApp3Type.MyWindow1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp3Type"
mc:Ignorable="d"
Title="MyWindow1" Height="450" Width="800">
<StackPanel Background="Blue">
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<TextBox Margin="5"/>
<Button Content="OK" Margin="5"/>
</StackPanel>
</Window>
public class MyButton : Button
{
public Type UserWindowType { get; set; }
protected override void OnClick()
{
base.OnClick();
//Window win = this.UserWindowType as Window;
Window win = Activator.CreateInstance(this.UserWindowType) as Window;
if (win != null)
{
win.ShowDialog();
}
}
}
Window2
<Window x:Class="WpfApp3Type.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp3Type"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<local:MyButton Content="show1" UserWindowType="{x:Type TypeName=local:MyWindow1}" Margin="5"/>
<local:MyButton Content="show2" UserWindowType="{x:Type local:MyWindow1}" Margin="5"/>
<Button x:Name="btn1" Content="Test2" Margin="5" Click="btn1_Click"/>
</StackPanel>
</Window>
4.3.2 x:Null 属性赋空值
作用:为属性赋空值
<Button Content="OK" Style="{x:Null}"/>
Style 样式
作用:可以使用Style样式,设置一组控件属性,可指定控件类型,应用到这一类型的所有控件;也可单独设置控件属性。
-
方式1:应用到这一类型的所有控件
初始化:
<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>
### 注意: <Style x:Key="{x:Type Button}" TargetType="{x:Type Button}"> 可简写为: <Style TargetType="Button">
使用
<StackPanel> <Button Content="OK"/> <Button Content="OK"/> <Button Content="OK"/> <Button Content="OK" Style="{x:Null}"/> </StackPanel>
-
方式2:应用到控件
初始化:
<Window.Resources> <Style x:Key="Button1" TargetType="{x:Type Button}"> <Setter Property="Width" Value="100"/> <Setter Property="Height" Value="36"/> <Setter Property="Margin" Value="5"/> </Style> </Window.Resources>
### 注意: <Style x:Key="Button1" TargetType="{x:Type Button}"> 可简写为: <Style x:Key="Button1" TargetType="Button">
使用
<StackPanel> <Button Content="OK"/> <Button Content="OK"/> <Button Content="OK"/> <Button Content="OK" Style="{StaticResource Button1}"/> <Button Content="OK" Style="{x:Null}"/> </StackPanel>
-
样式扩展
可以进行继承
<Window.Resources> <!-- .... other resources .... --> <!--A Style that affects all TextBlocks--> <Style TargetType="TextBlock"> <Setter Property="HorizontalAlignment" Value="Center" /> <Setter Property="FontFamily" Value="Comic Sans MS"/> <Setter Property="FontSize" Value="14"/> </Style> <!--A Style that extends the previous TextBlock Style with an x:Key of TitleText--> <Style BasedOn="{StaticResource {x:Type TextBlock}}" TargetType="TextBlock" x:Key="TitleText"> <Setter Property="FontSize" Value="26"/> <Setter Property="Foreground"> <Setter.Value> <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> <LinearGradientBrush.GradientStops> <GradientStop Offset="0.0" Color="#90DDDD" /> <GradientStop Offset="1.0" Color="#5BFFFF" /> </LinearGradientBrush.GradientStops> </LinearGradientBrush> </Setter.Value> </Setter> </Style> </Window.Resources>
4.3.3 标记扩展两种声明方式
-
方式1 用花括号声明
<Button Content="OK" Style="{StaticResource Button1}"/>
-
方式2 使用标签声明
<Button Content="OK"> <Button.Style> <x:Null/> </Button.Style> </Button>
4.3.4 x:Array 使用
作用:通过他的Items向他的使用者暴露已知的ArrayList实例,ArrayList成员类型由Type决定
向使用者提供ArrayList
<ListBox Margin="5">
<ListBox.ItemsSource>
<x:Array Type="sys:String">
<sys:String>ASD</sys:String>
<sys:String>QWE</sys:String>
</x:Array>
</ListBox.ItemsSource>
</ListBox>
## x:Array只能使用标签形式申明
字段和属性
字段:又称为:“成员变量”,一般在类的内部做数据交互使用。
属性:在面向对象设计中主要使用属性描述对象的静态特征。
class SetStudent
{
//字段
private string student = "name1";
//属性
public string Student
{
set { student = value; }
get { return student; }
}
}
4.3.5 x:Static
作用:使用x:static 标记扩展访问static成员
申明
//字段
public static string student = "name1";
//属性
public static string Student
{
set { student = value; }
get { return student; }
}
使用
Title="{x:Static local:Window4.student}"
<TextBox Text="{x:Static local:Window4.Student}"/>
4.4 XAML指令元素
x:Code 将代码放置到XAML中
<Grid>
<Button x:Name="button1" Content="OK" Click="Button1_Click" Margin="5"/>
</Grid>
<x:Code>
<![CDATA[
private void Button1_Click(object sender,RoutedEventArgs e)
{
MessageBox.Show("OK");
}
]]>
</x:Code>
x:XData 存放XmlDataProvider的内容数据
声明
# 注意XPath的路径要在x:Xdata中
<Window.Resources>
<XmlDataProvider x:Key="InventoryData" XPath="Inventory/Books">
<x:XData>
<Inventory xmlns="">
<Books>
<Fruit Name="Peach">ABCD</Fruit>
<Fruit Name="Banana">A1BCD</Fruit>
<Fruit Name="Orange">A2BCD</Fruit>
</Books>
<Drinks>
<Drink Name="Coca cola">A3BCD</Drink>
<Drink Name="PEPSI Cola">A4BCD</Drink>
</Drinks>
</Inventory>
</x:XData>
</XmlDataProvider>
</Window.Resources>
使用:
<ListBox>
<ListBox.ItemsSource>
<Binding Source="{StaticResource InventoryData}"/>
</ListBox.ItemsSource>
</ListBox>