对于Window定义,我可以使用WPF窗口中的XamlReader.Load或InitializeFromXaml吗?

时间:2009-08-09 20:30:42

标签: .net wpf xaml

我想生成一些将包含在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。怎么样?

2 个答案:

答案 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);