在运行时创建WPF窗口的对象

时间:2010-07-12 13:26:38

标签: wpf

我有一个带有一个字符串参数的函数。参数是现有wpf Window名称的名称。现在我想通过字符串参数创建一个window实例,并希望调用该窗口的Show()函数。

2 个答案:

答案 0 :(得分:3)

这取决于您给出的名称是窗口定义的文件名还是类名。通常这些都是相同的,但它们可能不同。

例如,您可以将以下内容放在名为“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的参数中包含命名空间(本例中为“Animals”),而不是将其附加到方法中。

加载仅提供标题的窗口

不推荐这样做,因为这可能是一项非常昂贵的操作。您需要获取程序集,迭代程序集中作为Window子类的所有类型,实例化每个类型,并提取其Title属性。这实际上构建(但不显示)应用程序中的每种窗口之一,直到找到正确的窗口。所以我尽可能使用文件名或类名。

答案 1 :(得分:0)

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