2009-08-09 45 views
3

我想制作一些将包含在WPF应用程序中的库代码。根据具体情况,图书馆可能会弹出一个窗口。我可以在XAML中定义窗口,但我想将XAML当作模板。在运行时,在创建窗口以便显示窗口时,我想用运行时定义的值替换Xaml模板中的某些标记。对于窗口定义,我可以使用WPF窗口中的XamlReader.Load或InitializeFromXaml吗?

我想要做的是这样的:

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。怎么样?

回答

4

您不能创建具有X动态页面:类属性。但是,如果后面的代码相同的每个动态页面,您可以通过更改模板来诱骗:

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”)。

2

是的。当您在xaml中创建窗口时,自动生成的部分定义包含一个名为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);

相关问题