XAML 概述四

这一节咱们来简单介绍一下XAML的加载和编译,它包括以下三种方式:工具

 · 只使用代码ui

 · 使用代码和未编译的XAMLthis

 · 使用代码和编译过的BAMLspa

 

一. 只使用代码线程

咱们首先建立一个简单的控制台应用程序。而后咱们添加PresentationFramework.dll、PresentationCore.dll、WindowsBase.dll和System.Xaml.dll。code

而后,咱们建立一个Window1.cs类文件:component

    public class Window1 : Window
    {

        private Button _button;

        public Window1()
        {
            InitializeComponent();
        }

        private void InitializeComponent()
        {
            Width = 400;
            Height = 300;
            Title = "Code-Only Window";

            _button = new Button {Content = "Clike Me", Margin = new Thickness(5)};
            _button.Click += (s, e) => MessageBox.Show("Code Only");

            var stackPanel = new StackPanel();
            IAddChild container = stackPanel;
            container.AddChild(_button);

            container = this;
            container.AddChild(stackPanel);

        }

    }

而后给Program.cs的Main方法添加[STAThread]特性,由于UI components须要当前线程是STA的。xml

[STAThread]
private static void Main()
{
     var window1 = new Window1();
     window1.ShowDialog();//这是模态窗口的调用方法,会阻塞当前线程,咱们关闭它,下面的才会输出
     Console.WriteLine("Window1 Closed");
}

这样,咱们一个简单的只使用代码的WPF程序就能彻底运行了。对象

 

二. 使用代码和未编译的XAMLblog

咱们在WPF应用程序中建立一个Window1.xaml文件,而后删除掉他的代码隐藏文件Window1.xaml.cs,而且把XAML文档的内容替换为:

<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Margin="5">
     <Button Name="Button">Click Me</Button>
</StackPanel>

而后修改该文件的属性:Build Action设置为None,把Copy to Output Directory设置为Copy always。这样就能够保证Window1.xaml文件位于可执行的应用程序文件夹中。

最后在MainWindow的后台代码中编写加载代码:

    /// <summary>
    ///     Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        /// <summary>
        /// 
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();

            ReadFromXaml();
        }

        private void ReadFromXaml()
        {
            DependencyObject rootElement;
            using (var fs = new FileStream("Window1.xaml", FileMode.Open, FileAccess.Read))
            {
                rootElement = (DependencyObject) XamlReader.Load(fs);
            }

            this.Content = rootElement;
            //var frameworkElement = (FrameworkElement) rootElement;
            //var button = (Button) frameworkElement.FindName("Button");
            var button = (Button) LogicalTreeHelper.FindLogicalNode(rootElement, "Button");
            if (button != null) button.Click += (s, e) => MessageBox.Show("Dynamically Loaded XAML");
        }
        
    }

咱们能够使用2种方式查找控件对象。这种松散的加载方式比较方便,可是先将XAML编译成BAML,而后在运行时加载BAML;比直接加载XAML效率要高。

 

三. 使用代码和编译过的BAML

这种方式是推荐的方式,也是咱们平时常常用到的方式。它具备以下的优势:

 · 有些内容能够自动生成。不须要在使用LogicalTreeHelper等方式查找控件

 · 在运行时读取BAML要比直接读取XAML快

 · 部署更简单,由于BAML文件嵌入到程序集中,不会丢失

咱们只须要了解一下,平时咱们使用Visual Studio工具编译WPF应用程序的时候。会首先把XAML文件编译成BAML。咱们查看WPF应用程序的\obj\Debug目录,就会发现一个MainWindow.baml的临时文件。同时使用选择的程序语言建立一个部分类,也存在于\obj\Debug目录下,名为MainWindow.g.i.cs(C#语言)。该文件包括该窗口包含的控件字段。从程序集加载和构建控件树的方法。将控件对象指定到各个字段以链接全部事件处理程序的代码。

相关文章
相关标签/搜索