我有另一个建议给你——真正的问题是:
我希望允许在运行时通过编辑XAML来编辑屏幕的简单布局。有人知道这是否可能吗?
答案绝对是“是”!当然,在做出一些假设的前提下,有许多方法可以实现这一点。
如果您在XAML的“动态”部分中没有处理事件或编写自定义值转换器(或通常在代码后面进行的任何其他操作),那么您可以简单地使用XamlReader类来解析包含XAML的XAML文件或字符串。由于您仅仅在编辑布局,我认为这些假设是正确的。
所以,这是我会做的事情:
1)编写所有自定义控件、数据模型、值转换器等,并将它们放入一个程序集中。
2)加载该程序集,可以让您的应用程序引用它,也可以动态加载它-两者都可以工作。
3)创建一个包含布局XAML的字符串/文件/资源(随便怎么选),并完成将.NET命名空间映射到XML命名空间的操作。确保根元素上没有“x:Class”属性,因为您没有代码后备文件!该字符串将使用标准WPF控件(如StackPanel)来布局您的自定义控件。(当然,您也可以编写自定义布局控件)。
4)允许用户编辑此字符串。编辑完成后,使用XamlReader解析文件,然后在窗口中显示生成的UIElement。
宾果!
一个问题是-每次更改XAML时,GUI都会被丢弃并创建一个新的。如果您的GUI是有状态的(即使当前插入符位置很重要),用户会很快感到恼怒。这取决于您的意图使用是什么-这可能不是问题。
我希望通过更多的工作,你可以编写一个MarkupExtension,用于引用你正在尝试布局的部分。这样当布局发生变化时,它们就可以被重复使用。
我希望这很清楚。如果不是,请告诉我,我可以扩展这个概念 - 这会是一个不错的博客文章。