2010-07-12 75 views

回答

2

這取決於您給出的名稱是窗口在其中定義的文件名還是類名。通常這些是相同的,但它們可以不同。

例如,您可能將下面的一個名爲「Elephant.xaml」文件:

<Window x:Class="Animals.Pachyderm" ...> 
    ... 
</Window> 

如果這樣做,那麼窗口的文件名是「Elephant.xaml」,但類名命名空間「動物」中的「Pachyderm」。

加載窗口指定的文件名

實例化並顯示給定文件名的窗口:

var window = (Window)Application.LoadComponent(new Uri("Elephant.xaml", UriKind.Relative)); 
window.Show(); 

所以你的方法會是這個樣子:

void ShowNamedWindow(string windowFileName) 
{ 
    var window = (Window)Application.LoadComponent(new Uri(windowFileName + ".xaml", UriKind.Relative)); 
    window.Show(); 
} 

並被這樣調用:

ShowNamedWindow("Elephant"); 

加載窗口給出的類名

實例化並顯示給定的類名稱的窗口:

var window = (Window)Activator.CreateInstance(Type.GetType("Animals.Pachyderm")); 

所以你的方法會是這個樣子:

void ShowNamedWindow(string className) 
{ 
    var window = (Window)Activator.CreateInstance(Type.GetType("Animals." + className)); 
    window.Show(); 
} 

並被這樣調用:

ShowNamedWindow("Pachyderm"); 

或者,您可以在ShowNamedWindow的參數中包含名稱空間(本例中爲「動物」),而不是將其附加到方法內。

加載只給出了標題欄的窗口

不建議這樣做,因爲這可能是一個非常昂貴的操作。您需要獲得Assembly,迭代Assembly中作爲Window子類的所有類型,實例化每個類型並提取其Title屬性。這實際上會構建(但不顯示)應用程序中的每種窗口之一,直到找到合適的窗口。所以我會盡可能使用文件名或類名。

+0

嗨雷,謝謝你的回答,它的工作很好,有點改變。你的代碼會給編譯時錯誤,因爲LoadComponent()將輸入變量作爲uri而不是字符串。所以你需要將它改爲LoadComponent(new Uri(「Window2.xaml」,System.UriKind.RelativeOrAbsolute)); – 2010-07-13 13:12:28

+0

愚蠢的我......這就像第五十次我忘記了LoadComponent需要一個Uri。編譯器每次都會提醒我。我已經解決了答案。 – 2010-07-16 04:47:05

0
Window newWindow = new Window() { Title = "a_string" }; 
newWindow.Show(); 
+0

它會創建一個不存在的新窗口。 如果我有一個帶「a_string」標題的窗口,並且裏面有一些其他控件。那麼我想在運行時創建它的一個對象,我們將如何做到這一點。 – 2010-07-12 13:51:01