我想生成一些将包含在WPF应用程序中的库代码。根据具体情况,库可能会弹出一个窗口。我可以在XAML中定义Window,但我想将XAML视为模板。在运行时,在创建Window以便可以显示它时,我想用运行时定义的值替换Xaml模板中的某些标记。
我想做的是这样的事情:
public partial class DynamicXamlWindow : Window
{
Button btnUpdate = null;
public DynamicXamlWindow()
{
string s = XamlTemplate;
// replace some things in the XamlTemplate here
Window root = System.Windows.Markup.XamlReader.Load(...);
Object _root = this.InitializeFromXaml(new StringReader(s).ReadToEnd()); //??
btnUpdate = // ???
//InitializeComponent();
}
XamlTemplate字符串如下所示:
private string XamlTemplate = @"
<Window x:Class='@@CLASS'
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
Title='@@TITLE'
Height='346' Width='380'>
<Grid>
...
我见过在XAML中定义按钮或节并动态加载的示例。但这不是按钮或部分。 XamlTemplate为实际的Window提供XAML。
这可能是使用InitializeFromXaml还是XamlReader.Load?如果是这样,怎么样?
然后我可以检索XAML中定义的控件,例如上面代码片段中的btnUpdate。怎么样?
答案 0 :(得分:4)
您无法创建具有x:class属性的动态页面。但是,如果每个动态页面背后的代码相同,您可以通过将模板更改为:
来欺骗它private string XamlTemplate = @"
<control:BaseWindow
xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
xmlns:control='WhateverHere'
Title='@@TITLE'
Height='346' Width='380'>
<Grid>...
当您准备解析此用途时:
XamlReader.Parse(xaml);
如果你想访问后面代码中的项目,那么代码隐藏中会出现this.FindName(“btnUpdate”)。
答案 1 :(得分:2)
是。在xaml中创建Window时,自动生成的部分定义包含一个名为InitializeComponent的方法。这种方法的内容基本上是:
System.Uri resourceLocater = new System.Uri("/SampleWpfApp;component/window1.xaml", System.UriKind.Relative);
System.Windows.Application.LoadComponent(this, resourceLocater);
所以你想要的是致电System.Windows.Application.LoadComponent(windowInstance, uri);