XAML 概述四
這一節(jié)我們來簡單介紹一下XAML的加載和編譯,它包括如下三種方式:
?· 只使用代碼
?·?使用代碼和未編譯的XAML
?·?使用代碼和編譯過的BAML
?
一. 只使用代碼
我們首先創(chuàng)建一個簡單的控制臺應(yīng)用程序。然后我們添加PresentationFramework.dll、PresentationCore.dll、WindowsBase.dll和System.Xaml.dll。
然后,我們創(chuàng)建一個Window1.cs類文件:
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需要當(dāng)前線程是STA的。
[STAThread] private static void Main() {var window1 = new Window1();window1.ShowDialog();//這是模態(tài)窗口的調(diào)用方法,會阻塞當(dāng)前線程,我們關(guān)閉它,下面的才會輸出Console.WriteLine("Window1 Closed"); }這樣,我們一個簡單的只使用代碼的WPF程序就能完全運(yùn)行了。
?
二.?使用代碼和未編譯的XAML
我們在WPF應(yīng)用程序中創(chuàng)建一個Window1.xaml文件,然后刪除掉他的代碼隱藏文件Window1.xaml.cs,并且把XAML文檔的內(nèi)容替換為:
<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Margin="5"><Button Name="Button">Click Me</Button> </StackPanel>然后修改該文件的屬性:Build Action設(shè)置為None,把Copy to Output Directory設(shè)置為Copy always。這樣就可以保證Window1.xaml文件位于可執(zhí)行的應(yīng)用程序文件夾中。
最后在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,然后在運(yùn)行時加載BAML;比直接加載XAML效率要高。
?
三.?使用代碼和編譯過的BAML
這種方式是推薦的方式,也是我們平時經(jīng)常用到的方式。它具有如下的優(yōu)點:
?·?有些內(nèi)容可以自動生成。不需要在使用LogicalTreeHelper等方式查找控件
?·?在運(yùn)行時讀取BAML要比直接讀取XAML快
?·?部署更簡單,因為BAML文件嵌入到程序集中,不會丟失
我們只需要了解一下,平時我們使用Visual Studio工具編譯WPF應(yīng)用程序的時候。會首先把XAML文件編譯成BAML。我們查看WPF應(yīng)用程序的\obj\Debug目錄,就會發(fā)現(xiàn)一個MainWindow.baml的臨時文件。同時使用選擇的程序語言創(chuàng)建一個部分類,也存在于\obj\Debug目錄下,名為MainWindow.g.i.cs(C#語言)。該文件包括該窗口包含的控件字段。從程序集加載和構(gòu)建控件樹的方法。將控件對象指定到各個字段以連接所有事件處理程序的代碼。
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/Mind-Hacker/p/3477026.html
總結(jié)
- 上一篇: R语言软件和RStudio环境的下载与安
- 下一篇: QQ登录超时,请检查您的网络或本机防火墙