XAML加载与编译可以分为四种:
- 仅使用代码进行WPF程序的生成
- 使用代码和未编译的标记
- 使用代码和编译过的BAML
1、只是用代码进行窗体的生成:优点是可以随意定制应用程序,缺点是没有可视化编辑窗口,会使得界面排版变得枯燥。
private void InitlizationMethod() { //设定窗体宽高 this.Width = this.Height = 250; //设定窗口位置 this.Left = this.Top = 100; this.Title = "只是用后台代码"; //创建一个栈面板放置Button DockPanel dockPanel = new DockPanel(); button1 = new Button() { Content = "点我", Margin = new Thickness(30) }; button1.Click += button1_click; IAddChild container = dockPanel; container.AddChild(button1); container = this; container.AddChild(dockPanel); } private void button1_click(Object sender, RoutedEventArgs e) { button1.Content = "完成√"; }
2、使用代码加载纯XAML文档:XamlReader对象会将XAML文档从文件流中读取出来,我们通过使用LogicTreeHelper类获取到窗口中的控件,从而操作他们。
- 先准备一个纯XAML文档
<DockPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <Button DockPanel.Dock="Bottom" Name="button1" Margin="30">点</Button> </DockPanel>
- 在后台代码中加载并操作它里面的控件
private void InitlizationMethod(string xamlFile) { //设定窗体宽高 this.Width = this.Height = 500; //设定窗口位置 this.Left = this.Top = 200; this.Title = "动态加载XAML"; //从其他文件中获取XAML内容 DependencyObject rootElement; using (FileStream fileStream = new FileStream(xamlFile, FileMode.Open)) { rootElement = (DependencyObject)XamlReader.Load(fileStream); } this.Content = rootElement; button1 = (Button)LogicalTreeHelper.FindLogicalNode(rootElement, "button1"); }
3、XAML被编译成二进制文件存在.baml为后缀的文件中,其次为窗口创建一个部分类以.g,cs为后缀。
- 当InitializeComponent()方法调用时加载BAML文件构建可视化对象。
- 在Connect()方法中将控件对象对应到字段中并且识别所有事件代码;该方法发现几个命名对象就会被调用几次。
- 部分类中不包含实例化和初始化的代码,初始化任务在Application.LoadComponent()处理BAML时执行。
4、只有XAML代码的文件,不使用任何代码:这样的XAML文件被称为松散的XAML。
- 删除一个XAML文档中的Class属性、删除所有事件特性
- 使用IE浏览器打开XAML文件