2008-12-01 75 views
6

是否可以通过xaml文件在运行时进行操作的方式部署WPF Windows应用程序?如果可能的话,我会想象这可以像一个可以将.aspx页面部署为内容的asp.net应用程序一样工作,然后在运行时即时编译。可以在不编译xaml的情况下部署wpf应用程序吗?

我想通过编辑XAML允许在运行时编辑屏幕的简单布局。有谁知道这是否可能?

编辑:当我参考xaml文件,我的意思是我的UIElement类相应的xaml。换句话说,我已经使用Xaml和代码隐藏,继承,事件处理程序,程序集引用等来定义UserControl类。部署时间到了,我希望能够保留代码隐藏功能,但仍然允许xaml被编辑。

回答

6

我有另一个建议你 - 真正的问题是:

“我想,让一个屏幕的简单的布局在运行 - 编辑通过编辑XAML的时间,有谁知道这是否可能?“

答案肯定是“YES”!有很多方法可以做到这一点,当然做一些假设。

如果您不需要在XAML的“动态”部分中处理事件或编写自定义值转换器(或其他任何通常会在代码中执行的操作),那么您可以简单地使用XamlReader类来解析包含XAML的XAML文件或字符串。既然你只是编辑布局,我认为这些假设是正确的。

所以,这里是我会做什么:

1)撰写您所有的自定义控制,数据模型,数值转换器等,并且在装配他们坚持。

2)加载该程序集,可以通过让应用程序引用它或动态加载它 - 两者都可以工作。

3)创建一个字符串/文件/资源​​(可以选择),它具有用于布局的XAML,并将.NET名称空间映射到XML名称空间。确保根元素没有“x:Class”属性,因为您没有代码背后的代码!该字符串将使用标准的WPF控件(如StackPanel)来布局自定义控件。 (当然你也可以编写自定义布局控件)。

4)允许用户编辑此字符串。当他们编辑它时,使用XamlReader解析文件,然后在窗口中显示生成的UIElement。

BINGO!

一个问题 - 每次更改XAML时,都会抛出GUI并创建一个新的问题。如果你的图形用户界面是健康的(即使当前的插入符号位置很重要),用户会很快感到恼火。这取决于你打算使用什么 - 这可能不是问题。

我希望通过一些更多的工作,您可以编写一个MarkupExtension,用于引用您尝试布局的部分。这样,布局更改时可以重用它们。

我希望这很清楚。如果没有,让我知道,我可以扩展这个概念 - 它会创建一个不错的博客条目。

5

不容易。 WPF应用程序将其XAML由编译器翻译为.g.cs和.baml,随后将其编译为二进制文件。

当然可以创建一个运行时XAML编译器。这不是一件容易的事,而且真的需要一些思考,为什么不把它当做一个网站来做!

1

如下图所示,您可以在运行时将XAML加载到应用程序中。

UIElement documentRoot = (UIElement)System.Windows.Markup.XamlReader.Load(xmlReader); 

有一个概念“宽松XAML”。宽松XAML基本上是让您打开您的硬盘上(在网页上或超链接)任何XAML文件和能力‘中运行’它无需编译的浏览器。

检查出其在该blog它只是在IE中打开一组按钮和自定义控制模板我已实施,http://wpf.ria-labs.com/ux.xaml这个样本松散XAML页面,您可以将XAML加载到一个WPF应用程序,可以使用。

+0

FWIW,我能用FF3打开它。如果有问题,我安装.NET 3.5SP1。 – Andy 2008-12-01 17:23:53

+0

但它并没有真正回答这个问题。操作系统明确指出,这是一个WPF应用程序,所以XAML在Web浏览器中显示的能力完全没有意义。 – GalacticCowboy 2008-12-01 18:54:31

+0

我使用'Web浏览器'来解释LooseXAML概念的更多特征。 – 2008-12-02 22:38:45

7

谢谢unthinkableMayhem供参考。

松散XAML的问题在于XamlReader在运行时调用时无法将事件连接到程序集中的函数,也没有动态加载程序集的机制。在XAML中指定处理路由事件的方式是WPF/XAML最大的设计缺陷之一,并且使松散的XAML变得无用。

我在将动态语言运行时(DLR)脚本嵌入到XAML中所做的工作对松散和编译XAML都很有用。我的意图是通过允许在宽松的XAML中提供路由事件,命令,值转换器和其他XAML/WPF概念,让宽松的XAML成为WPF中的头等公民。我觉得这已经实现了(虽然我的博客没有提到动态加载程序集,但是这很简单)。

如果您坚持,可以部署WPF Windows应用程序,以便可以在运行时操作xaml文件。哎呀,你可以动态生成嵌入脚本的XAML - 不需要大会。男人,这是我说了很长时间最有趣的事情之一。

虽然被警告 - XAML中的“X”只是一个营销术语。从工程角度来看,它不是可扩展的,所以当你走出微软制定的道路时,期待一个痛苦的世界。如果你喜欢这种方式,我会很乐意提供帮助 - 我的网站上有详细的联系方式(www.thinkbottomup.com.au)。

干杯,

2

看看http://xtrememvvm.codeplex.com/

它可以让让你使用松散XAML文件,但还是勾入事件,数据绑定和路由命令。

  • 克莱

于2012年10月7日编辑: 根据要求由罗伯特·哈维,我上面提到的框架的作者。没有试图隐藏任何东西,只是认为它是相关的,因为它是开源的。无论如何,我一定会在未来的职位上披露我的联盟(如果有的话)。

相关问题