我有一个字符串参数的函数。参数是现有wpf Window名称的名称。现在我想通过字符串参数创建一个窗口实例,并且想调用该窗口的Show()函数。在运行时创建WPF窗口的对象
1
A
回答
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
Window newWindow = new Window() { Title = "a_string" };
newWindow.Show();
+0
它会创建一个不存在的新窗口。 如果我有一个带“a_string”标题的窗口,并且里面有一些其他控件。那么我想在运行时创建它的一个对象,我们将如何做到这一点。 – 2010-07-12 13:51:01
相关问题
- 1. 在运行时创建WPF窗口
- 2. 在运行时压缩WPF窗口
- 3. 在运行时创建对象
- 4. 在运行时创建对象
- 5. 在运行时创建对象
- 6. 如何在运行时创建对象?
- 7. Spring运行时对象/ bean的创建
- 8. Wpf创建窗口锁
- 9. 创建WPF MDI窗口类
- 10. 在运行时动态创建WPF ItemTemplate
- 11. 如何在BackgroundWorker中创建WPF窗口?
- 12. 在WPF ResourceDictionary窗口中获取窗口对象
- 13. 在运行时创建XmlRpcUrl接口
- 14. 基于执行的SqlQuery在运行时创建对象
- 15. 如何在运行时创建WPF对话框?
- 16. WPF在运行时具有不同的窗口配置
- 17. 在弹出窗口动画运行时WPF窗口消息未触发
- 18. 创建对话框窗口
- 19. 创建WPF运行时控件
- 20. 如何在WPF中调整窗口大小时保留对象?
- 21. 从WinForms创建WPF窗口BackgroundWorker
- 22. 创建按钮来移动WPF窗口
- 23. WPF创建窗口弹出菜单
- 24. WPF更改窗口的内部视图并创建对象列表
- 25. 在运行时创建的对象上双击事件 - Delphi
- 26. 如何在运行时修改动态创建的UserControl对象
- 27. 在Unity中使用c#移动运行时创建的对象
- 28. 在运行时创建新的对象模板iPhone
- 29. 在运行时创建的参考对象
- 30. WPF窗口样式在运行时不工作
嗨雷,谢谢你的回答,它的工作很好,有点改变。你的代码会给编译时错误,因为LoadComponent()将输入变量作为uri而不是字符串。所以你需要将它改为LoadComponent(new Uri(“Window2.xaml”,System.UriKind.RelativeOrAbsolute)); – 2010-07-13 13:12:28
愚蠢的我......这就像第五十次我忘记了LoadComponent需要一个Uri。编译器每次都会提醒我。我已经解决了答案。 – 2010-07-16 04:47:05