这一节我们来简单介绍一下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 = ;
Height = ;
Title = "Code-Only Window"; _button = new Button {Content = "Clike Me", Margin = new Thickness()};
_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应用程序的\obj\Debug目录,就会发现一个MainWindow.baml的临时文件。同时使用选择的程序语言创建一个部分类,也存在于\obj\Debug目录下,名为MainWindow.g.i.cs(C#语言)。该文件包括该窗口包含的控件字段。从程序集加载和构建控件树的方法。将控件对象指定到各个字段以连接所有事件处理程序的代码。

XAML 概述四的更多相关文章

  1. XAML 概述

    我们将向 Windows 运行时应用开发人员介绍 XAML 语言和 XAML 概念,并介绍在使用 XAML 创建 Windows 运行时应用时,在 XAML 中声明对象和设置属性的不同方式. 什么是 ...

  2. XAML 概述二

    通过上一节我们已经对XAML有了一定的了解,这一节我们来系统的学习一下XAML. 一. 简单属性与类型转换器,属性元素: 我们已经知道 XAML是一种声明性的语言,并且XAML解析器会为每个标签创建一 ...

  3. WPF:XAML概述

    简介 XAML是eXtensible Application Markup Language可扩展应用程序标记语言,它是微软公司为构建应用程序用户界面而创建的一种新的描述性语言.XAML提供了一种便于 ...

  4. .Net Core WPF之XAML概述

    原文链接,机器翻译,有误处参看原文. XAML overview in WPF 2019/08/08 What is XAML XAML syntax in brief Case and white ...

  5. XAML 概述三

    通过对前面2节对XAML的介绍,我们对XAML有了一定的认识.这一节我们来简单了解一下部分XAML命名空间(x:)语言功能. x命名空间映射的是http://schemas.microsoft.com ...

  6. XAML 概述一

    XAML的全称是Extensible Application Markup Language,就是我们所说的可扩展应用程序标记语言.XAML可以应用到许多不同领域,但主要用于构建用户界面. XAML是 ...

  7. MOS管应用概述(四):基本参数

    mos管的基本参数,大家熟悉的必然是Ids电流,Ron导通电阻,Vgs的阈值电压,Cgs.Cgd.Cds这几项,然而在高速应用中,开关速度这个指标比较重要.<ignore_js_op> 上 ...

  8. css概述四

    八.文本格式化 2.文本属性 ①文本颜色 color:合法的颜色值 ②文本对齐方式 text-align: 取值 left/center/right/justify 注意  1.一个元素写了text- ...

  9. WPF从入门到放弃系列第二章 XAML

    本文是作者学习WPF从入门到放弃过程中的一些总结,主要内容都是对学习过程中拜读的文章的整理归纳. 参考资料 XAML 概述 (WPF):https://msdn.microsoft.com/zh-cn ...

随机推荐

  1. 用英文加优先级来解读C的声明

    比如:int ( * func_p ) ( double ); 首先着眼于标识符. func_p is 因为存在括号,(* func_p) 先被处理,这里着眼于* func_p is a pointe ...

  2. Java Script基础(二) 基本语法

    一.变量的声明和使用 JavaScript是一种弱类型的语言,没有明确的数据类型,在声明变量时,不需要指定变量的类型,变量的类型由赋给变量的值决定. 变量声明的语法: var 变量名; 示例: var ...

  3. c#几个小例子引发的思考

    楚广明老师的c#教程每一节都会给出几个小例子让大家联系,对于初学者来说这确实是一件很纠结的事情,下面我把这几个小例子简单的写一下.同时看一下我们学到了什么 1.面向过程版的圆周长面积计算 using ...

  4. AngularJs指令(一)

    AngularJs应用现在越来越流行了,谷歌都与微软合作支持AngularJS2.0,这是要逆天了,说明AngularJs将来大势所趋.最近想跳槽,又重新拾起了AngluarJs(之前由于缺少项目应用 ...

  5. 剑指Offer30 从1到n整数出现1的个数

    /************************************************************************* > File Name: 30_NumerO ...

  6. 苹果所有证书、appID、Provisioning Profiles配置说明及制作教程

    1.开发者证书(分为开发和发布两种,类型为ios Development,ios Distribution): 2.appID,这是每一个应用的独立标识,在设置项中可以配置该应用的权限,比如是否用到了 ...

  7. freeCodeCamp:Diff Two Arrays

    比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素.换言之,返回两个数组的差异. function diff(arr1, arr2) { var newArr = []; ...

  8. 【CSS3】---only-child选择器+only-of-type选择器

    only-child选择器 “:only-child”选择器选择的是父元素中只有一个子元素,而且只有唯一的一个子元素.也就是说,匹配的元素的父元素中仅有一个子元素,而且是一个唯一的子元素. 示例演示 ...

  9. Java注解(自定义注解、view注入)

    注解这东西虽然在jdk1.5就加进来了,但他的存在还是因为使用Afinal框架的view注入才知道的.一直觉得注入特神奇,加了一句就可以把对应view生成了. 下面我们来认识一下注解这个东西 一.注解 ...

  10. DWZ(JUI) 教程 普通表单提交

    一类是普通的表单提交,另一类就是列表页面的表单提交,主要是用来查询搜索列表使用的.今天我就简单介绍一下前者. 这是官网上的普通列表页面, <div class="pageContent ...