zoukankan      html  css  js  c++  java
  • XAML 概述四

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

     · 只使用代码

     · 使用代码和未编译的XAML

     · 使用代码和编译过的BAML

    一. 只使用代码

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

    然后,我们创建一个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需要当前线程是STA的。

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

    这样,我们一个简单的只使用代码的WPF程序就能完全运行了。

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

    我们在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应用程序的objDebug目录,就会发现一个MainWindow.baml的临时文件。同时使用选择的程序语言创建一个部分类,也存在于objDebug目录下,名为MainWindow.g.i.cs(C#语言)。该文件包括该窗口包含的控件字段。从程序集加载和构建控件树的方法。将控件对象指定到各个字段以连接所有事件处理程序的代码。

  • 相关阅读:
    vector容器(一)
    螺旋数组实现
    zigzag数组实现
    HDU 1496
    HDU 1381 Crazy Search
    什么叫软核,固核,硬核?
    “杜拉拉思维模式”之六:小组面试提升术
    硬件工程师电路设计必须紧记的十大要点
    面试的“群殴”宝典
    三段式状态机 [CPLD/FPGA]
  • 原文地址:https://www.cnblogs.com/Mind-Hacker/p/3477026.html
Copyright © 2011-2022 走看看