2009-08-09 76 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);

相關問題