2010-06-24 26 views
1

我知道可以在运行时解析一个XAML文件并创建一个UIElement,我可以将它插入到我的网页中,这里没有问题。WPF:在运行时替换页面或usercontrol的XAML(两者都可以)?

但我真正想要的是取代我的页面或usercontrol的整个XAML,也可能吗?

推理:

我想给我的应用程序的用户的机会,有应用程序运行(启动时需要年龄 - 因为一些历史遗留问题不能被缩短),并简单地更新由视图Blend中的“ctrl + s”。

回答

3

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

尼斯纯MVVM应用

首先让我们假设你有一个使用绑定和专门命令一个不错的纯MVVM应用程序,这样你就不会使用命名UI元素或代码隐藏事件处理程序。对你有好处:你有一个非常干净的应用程序架构,我喜欢你。

在这种情况下,所有你需要做的就是创建XAML文件的临时副本与x:Class属性去掉,并呼吁:

Application.LoadComponent(this, uriToTemporaryCopy); 

丑陋的不纯的非MVVM应用

现在让我们假设你使用了一个名为x的元素:你的代码后面的名字或者名字(淘气,淘气,淘气!),或者你使用XAML附加了一个事件处理器(不太淘气但不是纯粹的)。你没有一个漂亮的干净的建筑,但我仍然喜欢你。

在这种情况下,Application.LoadComponent不会自行完成,因为这些设置需要与代码隐藏进行集成。您还需要找到调用BAML编译器的方法。

由于代码隐藏的整合已经编译到您的网页或用户控件的子类,有一些限制:

  1. 您不能添加,删除或更改事件处理程序的顺序分配
  2. 你不能更改命名元素的名称或序列或添加更多命名元素

如果遵守这些规则,通常将合并到您的类中的生成代码不会更改,因此您可以加载新的XAML将文件转换为正在运行的应用程序而不会破坏任

的程序是:

  1. 编译XAML文件由A到BAML要么)构建含有项目,B)创建临时项目和在编译,或C)直接调用在PresentationBuildTasks标记编译任务。
  2. 使用Application.LoadComponent加载BAML文件,就像您在纯解决方案中编辑XAML文件一样。

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

什么是BAML文件?

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

+0

谢谢! :-) 我的应用程序是纯MVVM,因为我不喜欢背后的代码。 :-D – StormianRootSolver 2010-06-25 08:51:25

相关问题