代码之家  ›  专栏  ›  技术社区  ›  StormianRootSolver

WPF:在运行时替换页面或用户控件的XAML(两者都可以)?

  •  1
  • StormianRootSolver  · 技术社区  · 16 年前

    但是我真正想要的是替换我的页面或用户控件的整个XAML,这也可能吗?

    我想给我的应用程序的用户一个运行应用程序的机会(启动需要很长时间,而且不能因为一些遗留问题而缩短),只需在Blend中通过“ctrl+s”更新视图。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Ray Burns    16 年前

    这取决于是附加事件处理程序还是使用“Name”或“x:Name”属性从代码中访问UI元素。

    很好的纯MVVM应用程序

    首先,假设您有一个很好的纯MVVM应用程序,它专门使用绑定和命令,所以您不使用命名UI元素或代码隐藏事件处理程序。对你有好处:你有一个干净的应用程序架构,我喜欢你。

    在这种情况下,您只需创建一个XAML文件的临时副本,删除x:Class属性,然后调用:

     Application.LoadComponent(this, uriToTemporaryCopy);
    

    现在让我们假设您使用了一个名为x:Name的元素,或者使用了代码中的Name(调皮,调皮,调皮!),或者您使用XAML附加了一个事件处理程序(不那么顽皮,但也不纯粹)。你的建筑不干净,但我还是喜欢你。

    在这种情况下,Application.LoadComponent本身无法完成这一任务,因为这些设置需要与代码后面的集成。您还需要找到一种方法来调用BAML编译器。

    由于代码隐藏集成已经编译到页面或UserControl子类中,因此有一些限制:

    1. 不能更改命名元素的名称或序列,也不能添加更多的命名元素

    如果您遵守这些规则,那么生成的代码通常不会更改,因此您可以将新的XAML文件加载到正在运行的应用程序中,而不会破坏任何内容。

    1. 使用Application.LoadComponent加载BAML文件,就像在纯解决方案中加载已编辑的XAML文件一样。

    在已编译的.csproj项目中,任何已编译的BAML文件都将位于扩展名为.BAML的obj/debug或obj/release目录下。如果直接调用标记编译器任务,则可以决定输出位置。

    什么是BAML文件?

    对于那些不知道的人来说,BAML基本上是XAML的一种压缩和优化的二进制形式,是XAML存储在.exe或.dll中的方式。它还具有直接链接到生成的代码的功能,而XAML没有这种功能。

    推荐文章