是否可以以这样的方式部署WPF Windows应用程序,以便在运行时可以操作xaml文件?如果可能的话,我认为这可以类似于可以将.aspx页面部署为内容的asp.net应用程序,然后在运行时即时编译.
我想通过编辑XAML允许在运行时编辑屏幕的简单布局.有谁知道这是否可能?
编辑:当我引用xaml文件时,我指的是与我的UIElement类相对应的xaml.换句话说,我已经使用Xaml和代码隐藏,继承,事件处理程序,程序集引用等定义了UserControl类.当部署时间到来时,我希望能够保留代码隐藏功能但仍然允许xaml要编辑.
谢谢unthinkableMayhem的参考.
松散XAML的问题在于,XamlReader在运行时调用时,无法将事件连接到程序集中的函数,也没有动态加载程序集的机制.在XAML中指定路由事件的处理程序是WPF/XAML最大的设计缺陷之一,并使松散的XAML无用.
我在XAML中嵌入动态语言运行时(DLR)脚本所做的工作对松散和编译的XAML都很有用.我的目的是通过允许在松散的XAML中提供路由事件,命令,值转换器和其他XAML/WPF概念,使松散的XAML成为WPF中的一等公民.我觉得这已经实现了(虽然我的博客没有提到动态加载程序集,但这很简单).
如果您坚持,可以部署WPF Windows应用程序,以便在运行时可以操作xaml文件.哎呀,你可以使用嵌入式脚本动态生成XAML - 无需组装.伙计,这是我长期以来最有趣的事情之一.
但要注意 - XAML中的"X"只是一个营销术语.从工程的角度来看,它是不可扩展的,所以当你走出微软设定的道路时,期待一个痛苦的世界.如果您这样做,我将很乐意为您提供帮助 - 请访问我的网站(www.thinkbottomup.com.au).
干杯,
担
我还有另一个建议 - 真正的问题是:
"我想通过编辑XAML来允许在运行时编辑屏幕的简单布局.有人知道这是否可行?"
答案绝对是"是"!有许多方法可以实现这一点,当然做出一些假设.
如果您不需要处理事件或在XAML的"动态"部分中编写自定义值转换器(或通常在代码中的任何其他内容),那么您只需使用XamlReader类来解析XAML文件或包含XAML的字符串.由于您只是编辑布局,我希望这些假设成立.
那么,这就是我要做的:
1)编写所有自定义控件,数据模型,值转换器等,并将它们粘贴在一个组件中.
2)加载该程序集,通过让您的应用程序引用它或动态加载它们 - 两者都可以.
3)创建一个字符串/文件/资源(请选择),其中包含执行布局的XAML,以及.NET命名空间到XML命名空间的映射.确保根元素上没有"x:Class"属性,因为文件后面没有代码!该字符串将使用标准WPF控件(如StackPanel)来布局自定义控件.(当然你也可以编写自定义布局控件).
4)允许用户编辑此字符串.当他们编辑它时,使用XamlReader解析文件,然后在窗口中显示生成的UIElement.
答对了!
一个问题 - 每次更改XAML时,都会抛出GUI并创建一个新GUI.如果您的GUI很安全(即使当前插入位置很重要),用户也会很快感到烦恼.这取决于你打算使用什么 - 这可能不是问题.
我希望通过更多的工作,您可以编写一个MarkupExtension,用于引用您尝试布局的部分.通过这种方式,可以在布局更改时重复使用它们.
我希望这很清楚.如果没有,请告诉我,我可以扩展这个概念 - 它会成为一个很好的博客文章.
不容易.WPF应用程序将编译后的XAML转换为.g.cs和.baml,然后编译成二进制文件.
当然可以创建运行时XAML编译器.这不是一件容易的事,并且真的需要思考一下为什么不把它作为一个网站!