动态加载XAML

11-Windows10应用开发-动态加载XAML

1. 动态加载 XAML 基础概念

  • 定义:指在程序运行时,通过解析 XAML 格式的字符串或文件,动态生成 UI 界面的效果。
  • 常规与动态对比:
    • 默认方式:Windows 10 界面通常通过 .xaml 文件与 .xaml.cs 关联编译呈现(静态设计)。
    • 动态方式:当无法预先设计所有 UI 元素(如根据数据动态生成控件)时,需在运行时动态加载。
  • 核心方法:使用 XamlReader.Load 方法。
  • 底层机制:XamlReader 类用于分析 XAML 并创建对应的 Windows 10 对象树。Load 方法接收格式良好的 XAML 片段字符串,解析后返回该对象树的根元素。

2. 字符串 XAML 的严格要求

动态加载的字符串必须满足以下条件:

  1. 单根元素:字符串必须定义唯一的根元素。
  2. 格式合法:必须是格式良好、可解析的 XML/XAML。
  3. 命名空间:根元素必须指定默认的 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)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注