2010-07-12 45 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