在运行时创建WPF窗口的对象
答
这取决于您给出的名称是窗口在其中定义的文件名还是类名。通常这些是相同的,但它们可以不同。
例如,您可能将下面的一个名为“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属性。这实际上会构建(但不显示)应用程序中的每种窗口之一,直到找到合适的窗口。所以我会尽可能使用文件名或类名。
答
Window newWindow = new Window() { Title = "a_string" };
newWindow.Show();
+0
它会创建一个不存在的新窗口。 如果我有一个带“a_string”标题的窗口,并且里面有一些其他控件。那么我想在运行时创建它的一个对象,我们将如何做到这一点。 – 2010-07-12 13:51:01
嗨雷,谢谢你的回答,它的工作很好,有点改变。你的代码会给编译时错误,因为LoadComponent()将输入变量作为uri而不是字符串。所以你需要将它改为LoadComponent(new Uri(“Window2.xaml”,System.UriKind.RelativeOrAbsolute)); – 2010-07-13 13:12:28
愚蠢的我......这就像第五十次我忘记了LoadComponent需要一个Uri。编译器每次都会提醒我。我已经解决了答案。 – 2010-07-16 04:47:05