2012-01-31 170 views
0

對於來自Delphi世界的WPF,我很新。我在Delphi世界的下面解決了這個問題(儘管很痛苦),希望WPF世界有一個更優雅的解決方案。按名稱訪問窗口

我需要讀取一個XML文件,其中包含菜單「tree」,其中包含窗口名稱以及菜單提示,然後能夠根據其名稱「顯示」窗口。

例如,菜單的部分,有兩個選擇,可能有這樣的XML:

<MenuLeaf> 
    <Header>Product information</Header> 
    <MenuLine>  
    <Prompt>Product Master File</Prompt> 
    <WindowName>Products.xaml</WindowName> 
    </MenuLine> 
    <MenuLine>  
    <Prompt>Inventory Data</Prompt> 
    <WindowName>Inventory.xaml</WindowName> 
    </MenuLine> 
</MenuLeaf> 

因此,當用戶使得「庫存數據」的選擇,我就知道我想幹什麼一個「顯示」窗口Inventory.xaml .....但我只有字符串「Inventory.xaml」。

我將有數百個這樣的形式,而XML文件可以改變不時 - 所以對我來說,有

Dim window as New Inventory 
window.Show 

標準代碼爲每個幾百個窗口是不能奏效的。

我需要的是什麼,做

Dim window as New {go out and find the Inventory file with name Inventory.xaml} 
window.Show 

我尋覓不休這個沒有運氣。

回答

1

我認爲解決方案的路徑是使用反射,這將允許您動態查找/調用您的類。假設你的命名空間是MyNs,那麼你必須在其中有一個'Products'類,它與'Products.xaml'文件相對應。要找到它,請使用MyFoundType = MyNs.GetType(「Products」)
然後獲取此類型的默認(或其他如果您喜歡)構造函數:MyFoundType.GetConstructor()。然後調用構造函數(如果需要,使用參數) - >你現在把你的窗口當作一個Object。
將其轉換爲窗口並調用其Show方法,就完成了。

http://msdn.microsoft.com/en-us/library/y0cd10tb.aspx
http://msdn.microsoft.com/en-us/library/h93ya84h.aspx
http://msdn.microsoft.com/en-us/library/6ycw1y17.aspx

+0

我同意這一點;但是你應該可以使用Activator.CreateInstance(type);而不是在尋找這種方法時感到煩惱。喜歡的東西:VAR贏=(窗口)Activator.CreateInstance(<獲取大會> .GetType(); – Adam 2012-01-31 22:46:51

+0

肯定是一個簡短的表達方式:-) – GameAlchemist 2012-01-31 22:52:00

0

您需要使用XamlReader對象,它在運行時解析XAML並創建對象。

var rdr = XmlReader.Create(File.Open("Inventory.xaml")); 
var window = XamlReader.Load(rdr) as Window; 
window.Show(); 

XamlReader.Load將返回XAML中指定的實際頂級元素;如果是Window那麼你只需要.Show吧。如果是別的東西,你需要一個容器,把它放在例如,你可能有它一個Border元素的Window做:

var control = XamlReader.Load(rdr) as UserControl; 
var window = new MyHostWindow(); 
window.ContentBorder.Child = control; 

如果你真的不知道的類型元素在您的XAML中通常可以使用FrameworkElement,它是所有可視元素的基類,但您不會從中獲得特定於Window的行爲。

+0

你會怎麼做,如果窗口的構造函數參數(S)? – GameAlchemist 2012-01-31 22:53:06

+0

他說他有一個包含他需要的窗口的XAML文件。只要它是一個有效的XAML文件,XamlReader就會構建它。 XALM元素必須具有無參數的構造函數和公共屬性,因爲這就是XAML的工作原理。 如果你想在構造函數中構造一個需要參數的可視化元素,你不能在XAML中完成,而XamlReader將無法工作。 – 2012-02-01 00:43:29