11-Windows10应用开发-动态加载XAML
1. 动态加载 XAML 基础概念
- 定义:指在程序运行时,通过解析 XAML 格式的字符串或文件,动态生成 UI 界面的效果。
- 常规与动态对比:
- 默认方式:Windows 10 界面通常通过
.xaml文件与.xaml.cs关联编译呈现(静态设计)。 - 动态方式:当无法预先设计所有 UI 元素(如根据数据动态生成控件)时,需在运行时动态加载。
- 默认方式:Windows 10 界面通常通过
- 核心方法:使用
XamlReader.Load方法。 - 底层机制:
XamlReader类用于分析 XAML 并创建对应的 Windows 10 对象树。Load方法接收格式良好的 XAML 片段字符串,解析后返回该对象树的根元素。
2. 字符串 XAML 的严格要求
动态加载的字符串必须满足以下条件:
- 单根元素:字符串必须定义唯一的根元素。
- 格式合法:必须是格式良好、可解析的 XML/XAML。
- 命名空间:根元素必须指定默认的 XML 命名空间(通常为
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation")。
private const string FadeInStoryboard =
@"<Storyboard xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
<DoubleAnimation Duration=""0:0:0.2"" Storyboard.TargetProperty=""(UIElement.Opacity)"" To=""1""/>
</Storyboard>";
// 解析字符串并转换为具体类型
Storyboard storyboard = XamlReader.Load(FadeInStoryboard) as Storyboard;Code language: PHP (php)
private void button1_Click(object sender, RoutedEventArgs e)
{
// 1. 构造包含命名空间的 XAML 字符串(注意引号转义)
string str = @"<Button xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
Name=""button3"" Canvas.Top=""100"" Canvas.Left=""12"" Click=""button3_Click"">北盟网校3</Button>";
// 2. 使用 XamlReader.Load 解析为对象并强制转换
Button button3 = (Button)XamlReader.Load(str);
// 3. 动态绑定事件(后台代码绑定,因动态生成的 XAML 无法直接关联隐藏代码方法)
button3.Click += button3_Click;
// 4. 将新控件追加到容器(如 Canvas)中
this.canvas.Children.Add(button3);
}
private void button3_Click(object sender, RoutedEventArgs e)
{
// 动态按钮触发的跳转逻辑
this.Frame.Navigate(typeof(MainPage));
}Code language: PHP (php)
Previous: XAML的事件与编译原理
Next: 将一个xaml文件动态加载到程序里面的XAML