是否可以部署WPF Windows应用程序,以便在运行时可以操作xaml文件?如果可能的话,我认为这可以类似于一个asp.net应用程序,它可以将.aspx页面部署为内容,然后在运行时即时编译。
我想通过编辑XAML来允许在运行时编辑屏幕的简单布局。有谁知道这是否可行?
编辑:当我提到xaml文件时,我指的是与我的UIElement类相对应的xaml。换句话说,我已经使用Xaml和代码隐藏,继承,事件处理程序,程序集引用等定义了UserControl类。当部署时间到来时,我希望能够保留代码隐藏功能但仍然允许xaml待编辑。
答案 0 :(得分:7)
感谢younthinkableMayhem的参考。
松散XAML的问题在于,XamlReader在运行时调用时,无法将事件连接到程序集中的函数,也没有动态加载程序集的机制。在XAML中指定路由事件的处理程序是WPF / XAML最大的设计缺陷之一,并使松散的XAML无用。
我在XAML中嵌入动态语言运行时(DLR)脚本所做的工作对松散和编译的XAML都很有用。我的目的是通过允许在松散的XAML中提供路由事件,命令,值转换器和其他XAML / WPF概念,使松散的XAML成为WPF中的一等公民。我觉得这已经实现了(虽然我的博客没有提到动态加载程序集,但这很简单。)
如果您坚持,可以部署WPF Windows应用程序,以便在运行时可以操作xaml文件。哎呀,你可以使用嵌入式脚本动态生成XAML - 无需组装。伙计,这是我长期以来最有趣的事情之一。
请注意 - XAML中的“X”只是一个营销术语。从工程的角度来看,它是不可扩展的,所以当你走出微软设定的道路时,期待一个痛苦的世界。如果你走这条路,我会很乐意提供帮助 - 请联系我的网站(www.thinkbottomup.com.au)。
干杯,
丹
答案 1 :(得分:7)
我还有另一个建议 - 真正的问题是:
“我想通过编辑XAML来允许在运行时编辑屏幕的简单布局。有谁知道这是否可行?”
答案肯定是“是”!并且有很多方法可以实现这一点,当然做出一些假设。
如果您不需要在XAML的“动态”部分处理事件或编写自定义值转换器(或通常在代码中的任何其他内容),那么您只需使用XamlReader类来解析XAML文件或包含XAML的字符串。由于您只是编辑布局,我希望这些假设成立。
所以,我会这样做:
1)编写所有自定义控件,数据模型,值转换器等,并将它们粘贴在一个组件中。
2)通过让你的应用程序引用它或动态加载它来加载该程序集 - 两者都可以。
3)创建一个字符串/文件/资源(请选择),其中包含用于布局的XAML,以及.NET命名空间到XML命名空间的映射。确保根元素上没有“x:Class”属性,因为文件后面没有代码!该字符串将使用标准WPF控件(如StackPanel)来布局自定义控件。 (当然你也可以编写自定义布局控件)。
4)允许用户编辑此字符串。当他们编辑它时,使用XamlReader解析文件,然后在窗口中显示生成的UIElement。
宾果!
一个问题 - 每次更改XAML时,都会抛出GUI并创建一个新GUI。如果您的GUI很安全(即使当前插入位置很重要),用户也会很快感到烦恼。这取决于你打算使用什么 - 这可能不是问题。
我希望通过更多的工作,您可以编写一个MarkupExtension,用于引用您尝试布局的部分。这样,当布局改变时,它们可以被重用。
我希望这很清楚。如果没有,请告诉我,我可以扩展这个概念 - 它会成为一个很好的博客条目。
答案 2 :(得分:5)
不容易。 WPF应用程序将编译后的XAML转换为.g.cs和.baml,然后编译成二进制文件。
当然可以创建运行时XAML编译器。这不是一件容易的事,并且真的需要考虑一下为什么不将它作为一个网站!
答案 3 :(得分:2)
这篇博文:http://www.thinkbottomup.com.au/site/blog/Embedding_DLR_Scripts_in_XAML_Part_6提供了一些关于在运行时加载XAML以及其他有趣内容的信息。
答案 4 :(得分:2)
查看http://xtrememvvm.codeplex.com/
它允许您使用松散的XAML文件,但仍然挂钩事件,数据绑定和路由命令。
2012年10月7日编辑: 根据Robert Harvey的要求,我是上述框架的作者。不是试图隐藏任何东西,只是认为它是相关的,因为它是开源的。无论如何,我一定会在以后的任何帖子中披露我的联盟(如果有的话)。
答案 5 :(得分:0)
XAMLPad和XAML Cruncher都这样做,所以一定是可能的。
XAML Cruncher源代码仅在Charles Petzold关于WPF的书中提供:
http://www.charlespetzold.com/wpf/
看起来它使用XamlReader来解析XAML。
答案 6 :(得分:0)
您可以在运行时将XAML加载到应用程序,如下所示。
UIElement documentRoot = (UIElement)System.Windows.Markup.XamlReader.Load(xmlReader);
有一个“松散XAML”的概念。松散的XAML基本上是允许您打开硬盘上的任何XAML文件(或网页上的超链接)并在浏览器中“运行”而无需编译的功能
查看此示例松散的XAML页面,其中包含一组我已实现的按钮和自定义控件模板http://wpf.ria-labs.com/ux.xaml在此blog中它只在IE中打开。您可以将XAML加载到WPF应用程序并可以使用。