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#語言)。該文件包括該窗口包含的控件字段。從程序集加載和構建控件樹的方法。將控件對象指定到各個字段以鏈接全部事件處理程序的代碼。

相關文章
相關標籤/搜索