[笔记/简译]XAML揭秘(6)

来源:互联网 发布:手机必装软件 编辑:程序博客网 时间:2024/05/30 04:39

XAML和程序代码的混合

    WPF应用程序可以完全由任何.NET语言编写而成,简单的应用程序也可以完全由XAML写成,但大多数WPF应用程序则是由XAML和程序代码混合而成的。

 

在运行时加载和解析XAML

    System.Windows.Markup命名空间中的XamlReaderXamlWriter分别用于读取XAML和写入XAMLXamlReader定义了一些重载的静态方法LoadXamlWriter定义一些重载的静态方法Save

 

XamlReader

    XamlReader.Load方法用于解析XAML文件、创建合适的.NET对象以及返回根元素的实例。假设当前目录包含XAML文件MyWindow.xaml,则可以通过下例方法加载并取得Window对象:

Window window = null;

using (FileStream fs =

new FileStream("MyWindow.xaml", FileMode.Open, FileAccess.Read))

{

//  获得根元素Window

Window win = (Window)XamlReader.Load(fs);

}

    XamlReader类还定义了LoadAsync实例方法用以异步加载XAML文件。在加载较大文件或通过网络加载时,为了用户界面能够及时响应,则可以考虑使用异步模型。

    假设Window拥有一个StackPanel类型的子元素,且该子元素的第5个子元素为OK按钮,则下面示例可以获得它们的引用(接上例):

StackPanel panel = (StackPanel)window.Content;

Button okButton = (Button)panel.Children[4];

    此后就可以使用Button的引用来完成一些XAML做不到的事情,比如调用按钮类的某个方法、设置额外的属性或者附加事件处理器等。

 

XAML元素命名

    XAML语言命名空间中包含一个Name关键字,它用来设置元素的名称,如下(该用法实际上有误,因为x:Name需和x:Class一同使用,此处仅为示意):

    <Button x:Name="okButton">OK</Button>

    改动之后对应的C#代码将会更一般化,如下:

    Button okButoon = (Button)window.FindName("okButton");

    FindWindow方法并不是Window类的方法,它定义在FrameworkElementFrameworkContentElement类中。这两个类都是WPF中非常重要的类。

    x:Name可以用来命名元素,但是某些类定义了可以被当作元素名称的属性(通过添加System.Windows.Markup.RuntimeNamePropertyAttribute实现),如FrameworkElementFrameworkContentElement中都有Name属性,它们被标记为RuntimeNameProperty(“Name”)。这说明我们在这种元素上可以简单地通过设置Name属性来为其设置名称,而无需使用x:Name。我们可以在这两种方法中选择一种使用,但不可两种都用。XAML提供这种机制的目的是为了在程序代码中可以方便地使用Name属性,否则将不得不在XAML文件中同时设置Namex:Name的值。

    (这里的所说的为XAML元素命名实际上包含两重含义。第一重是说,通过某些元素的Name属性或通过x:Name关键字,可以为元素指定一个名称。这个名称被看做一个key值,可以通过FrameworkElementFindName方法获得相应的value值,该值即为那个元素的引用。第二重是说,如果在VS中使用code-behind文件和分部类,VS将会自动创建一个该元素类型的变量,且这个变量的名称与该元素的名称相同。如上例,ButtonName属性值为okButton,则在分部类中,可以直接通过名为okButton的变量引用该按钮对象。此外,对于那些标记了RuntimeNameProperty(“Name”)的类型,无论是通过Name属性还是x:Name关键字设置的XAML元素名称,在程序代码中都可以通过Name属性获得,如下例:

    XAML

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

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

x:Class="MyWindow">

           <Button Content="OK" x:Name="okButton" />

</Window>

C#

public partial class Window1 : System.Windows.Window

        {

public Window1()

{

InitializeComponent();

System.Diagnostics.Debug.WriteLine(this.okButton.Name);

}

}

调试运行程序,将会看到调试控制台显示“okButton”。)

原创粉丝点击