English 中文(简体)
一个WPF应用程序可以在不编译XAML的情况下部署吗?
原标题:
  • 时间:2008-12-01 16:05:52
  •  标签:

是否可能以这样的方式部署WPF窗口应用程序,以便在运行时可以操纵xaml文件?如果可能,我想这将类似于可以将.aspx页面部署为内容的asp.net应用程序,然后在运行时进行即时编译的工作方式。

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

编辑: 当我提到 xaml 文件时,我指的是与我的 UIElement 类相对应的 xaml。换句话说,我使用 Xaml 和代码后端、继承、事件处理程序、程序集引用等定义了 UserControl 类。在部署时,我希望能够保留代码后端功能,但仍然允许编辑 xaml。

最佳回答

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

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

答案绝对是“是”!当然,在做出一些假设的前提下,有许多方法可以实现这一点。

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

所以,这是我会做的事情:

1)编写所有自定义控件、数据模型、值转换器等,并将它们放入一个程序集中。

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

3)创建一个包含布局XAML的字符串/文件/资源(随便怎么选),并完成将.NET命名空间映射到XML命名空间的操作。确保根元素上没有“x:Class”属性,因为您没有代码后备文件!该字符串将使用标准WPF控件(如StackPanel)来布局您的自定义控件。(当然,您也可以编写自定义布局控件)。

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

宾果!

一个问题是-每次更改XAML时,GUI都会被丢弃并创建一个新的。如果您的GUI是有状态的(即使当前插入符位置很重要),用户会很快感到恼怒。这取决于您的意图使用是什么-这可能不是问题。

我希望通过更多的工作,你可以编写一个MarkupExtension,用于引用你正在尝试布局的部分。这样当布局发生变化时,它们就可以被重复使用。

我希望这很清楚。如果不是,请告诉我,我可以扩展这个概念 - 这会是一个不错的博客文章。

问题回答

感谢unthinkableMayhem的推荐。

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

我在将Dynamic Language Runtime (DLR)脚本嵌入XAML中的工作对松散XAML和编译XAML都有用。我的意图是通过允许在松散XAML中使用路由事件、命令、值转换器和其他XAML/WPF概念,使松散XAML成为WPF的一等公民。我认为这已经实现了(尽管我的博客没有提到动态加载程序集,但这很简单)。

如果你坚持不懈,就有可能以这样的方式部署WPF窗口应用程序,使得可以在运行时操作xaml文件。 哎呀,你甚至可以动态生成带有嵌入式脚本的XAML——不需要任何程序集。 哇,这是我很长时间以来说的最有趣的事情之一。

请注意 - XAML中的“X”只是营销术语。从工程角度来看,它并不具备可扩展性,因此如果你走出了微软所规划的道路,就会遇到许多问题。如果你选择这条路,我很乐意提供帮助 - 我的联系方式在我的网站上(www.thinkbottomup.com.au)。

干杯

不容易。WPF 应用程序的 XAML 通过编译器翻译成 .g.cs 和 .baml,并随后编译成二进制。

当然,创建一个运行时XAML编译器是可能的。这并不是一个容易的任务,而且真的需要思考为什么不只是将其制作成一个网站!

这篇博客文章:http://www.thinkbottomup.com.au/site/blog/Embedding_DLR_Scripts_in_XAML_Part_6 包含了关于运行时加载XAML和其他好玩的东西的一些信息。

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

它允许您使用松散的XAML文件,但仍然可以挂接事件、数据绑定和路由命令。

  • Clay

Edit on Oct. 7, 2012: As requested by Robert Harvey, I am the author of framework mentioned above. Wasn t trying to hide anything just didn t think it was relevant given that it is open source. In any case, I will be sure to disclose my affiliation (if any) in any future posts.

XAMLPad和XAML Cruncher都可以做到,所以一定是可能的。

XAML Cruncher源代码仅在Charles Petzold的WPF书中可用:

将此翻译成中文:http://www.charlespetzold.com/wpf/ http://www.charlespetzold.com/wpf/

看起来它使用XamlReader来解析XAML。

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

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

有一个“宽松的XAML” 概 念。 宽松的XAML基本上是一种功能,它允许您在浏览器中打开您硬盘上的任何XAML文件(或网页上的超链接),而不需要编译它。

请查看此示例松散的XAML页面,其中包含我已经实现的一组按钮和自定义控件模板,http://wpf.ria-labs.com/ux.xaml 在此博客中它只在IE中打开。您可以将XAML加载到WPF应用程序中并使用。





相关问题
热门标签