先说一些基本的, .NET的模块称为程序集(Assembly)。一般情况下,用VS创建的是解决方案(Solution),一个解决方案就是一个完整的程序。解决方案中包含若干个项目
(Project),每个项目是可以独立编译的,他的编译结果是一个程序集。常见的程序集是以.exe为扩展名的可执行程序或者是以.dll为扩展名的动态链接库,大多数情况下,我们
说“引用其他程序集”的时候,说的是动态链接库。因为.NET编程接口(Application Programming Interface, API)以类和类级别的单元为主,所以我们又常把引用程序集说成是引
用类库。名称空间的作用是避免同名类的冲突。比如一个程序中引用了LibA.dll和LibB.dll两个类库,这两个类库中都有一个叫Converter的类,若没有名称空间来限定,编译器可能
会弄混。应用名称空间,把LibA.dll中的Converter放在一个名为Microsoft的名称空间,LibB.dll中的Converter放在名为Google名称空间里,就可以用Microsoft.Converter和
Google.Converter来区分这两个类了。
假设类库程序集名为MyLibrary.dll,其中包含Common和Controls两个名称空间,且已经将其引用进WPF项目,那么在XAML中引用这两个名称空间的语法是:
xmlns:映射名=“clr-namespace:类库中名称空间的名字;assembly=类库文件名”
对于MyLibrary.dll里的两个名称空间,XAML中的引用会是:
xmlns:common="clr-namespace:Common;assembly=MyLibrary"
xmlns:controls="clr-namespace:Controls;assembly=MyLibrary"
使用Common和Controls中的类,代码是这样:
<common:MessagePanel x:Name="window1"/>
<controls:LedButton x:Name="button1"/>
在C#中引用Common和Controls名称空间时可以如下所写:
using Cmn=Common;
using Ctl=Controls;
x名称空间映射的是 http://schemas.microsoft.com/winfx/2006/xaml,亦可称为"XAML名称空间"。其里面主要分为三类:Attribute,标记扩展和XAML指令元素。
x名称空间中的Attribute
1. x:Class
这个Attribute 的作用是告诉XAML编译器将XAML标签的编译结果与后台代码中指定的类合并。使用时的要求:
这个Attribute只用于根结点;使用x:Class的根结点类型与x:Class的值所指示的类型保持一致;x:Class的值所指示的类型在声明时必须用partial关键字
注意:x:ClassModifier的值必须与x:Class所指示类的访问控制级别一致。若XAML文档中 x:ClassModifier="internal" ,编译器会报错,因为实际上在C#中定义的级别是public.
在C#中,private与internal等价
2. x:Name
作用有两个:
告诉XAML编译器,当一个标签带有x:Name时,除了为这个标签生产对应实例外还要为这个实例声明一个引用变量,变量名就是x:Name的值;
将XAML标签所对应对象的Name属性(如果有)也改为x:Name的值,并把这个值注册到UI树上,以方便查找。
3. x:FieldModifier
默认情况下,字段的访问级别按照面向对象的封装原则被设置成了 internal. 在编程时,有时候我们需要从一个程序集访问另一个程序集中窗体的元素。这时需要把被访问控件的引用变量改为public级别,x:FieldModifier就是用来在XAML里改变引用变量访问级别的,如:
<StackPanel>
<TextBox x:Name="textBox1" x:FieldModifier="public" Margin="5"/>
<TextBox x:Name="textBox2" Margin="5"/>
</StaclPanel>
用IL得子段textBox1级别为public ,而子段textBox2为internal (assembly class)
4. x:Key
作用就是为资源贴上用于检索的索引
<Window x:Class="Wpftest.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="500" Width="900">
<Window.Resources>
<sys:String x:Key="myString">Hello WPF Resource!</sys:String>
</Window.Resources>
<StackPanel Background="Gray">
<TextBox Text="{StaticResource ResourceKey=myString}" Margin="5"/>
<TextBox x:Name="textBox1" Margin="5"/>
<Button Content="Show" Click="Button_Click" Margin="5"/>
</StackPanel>
</Window>
namespace Wpftest
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string str = this.FindResource("myString") as string;
this.textBox1.Text = str;
}
}
}
5. x:Shared
一定与x:Key 配合使用。若x:Shared的值为true, 那么每次检索到这个对象时,我们得到的都是同一个对象,否则若x:Shared的值为false. 每次我们检索到这个对象时,我们得到
的都是这个对象的一个新副本。XAML编译器会为该资源隐藏地添加 x:Shared="true"