Wpf 按名称访问windows

Wpf 按名称访问windows,wpf,window,find,Wpf,Window,Find,我是WPF的新手,来自德尔福世界。我在Delphi世界中解决了下面的问题(尽管很痛苦),希望WPF世界中有一个更优雅的解决方案 我需要读入一个包含菜单“树”的XML文件,其中包含窗口名以及菜单提示,然后能够根据窗口名“显示”窗口 例如,具有两个选项的菜单段可能具有如下XML: <MenuLeaf> <Header>Product information</Header> <MenuLine> <Prompt>Pr

我是WPF的新手,来自德尔福世界。我在Delphi世界中解决了下面的问题(尽管很痛苦),希望WPF世界中有一个更优雅的解决方案

我需要读入一个包含菜单“树”的XML文件,其中包含窗口名以及菜单提示,然后能够根据窗口名“显示”窗口

例如,具有两个选项的菜单段可能具有如下XML:

<MenuLeaf>
  <Header>Product information</Header>
  <MenuLine>    
    <Prompt>Product Master File</Prompt>
    <WindowName>Products.xaml</WindowName>
  </MenuLine>
  <MenuLine>    
    <Prompt>Inventory Data</Prompt>
    <WindowName>Inventory.xaml</WindowName>
  </MenuLine>
</MenuLeaf>
几百个窗口中的每一个

我需要的是一些能

Dim window as New {go out and find the Inventory file with name Inventory.xaml}
window.Show

我没完没了地寻找这个问题,但运气不佳。

我认为解决方案的途径是使用反射,这将允许您动态查找/调用类。假设您的命名空间是MyNs,那么您必须在其中有一个与“Products.xaml”文件相对应的“Products”类。要找到它,请使用MyFoundType=MyNs.GetType(“产品”)
然后获取此类型的默认(或其他,如果您愿意)构造函数:MyFoundType.GetConstructor()。然后调用构造函数(如果需要,可以使用参数)-->现在您的窗口是一个对象。
将其投射到窗口并调用其Show方法,就完成了




您需要使用XamlReader对象,它在运行时解析XAML并创建对象

var rdr = XmlReader.Create(File.Open("Inventory.xaml"));
var window = XamlReader.Load(rdr) as Window;
window.Show();
XamlReader.Load
将返回XAML中实际顶级元素指定的任何内容;如果它是一个
窗口
,您只需
。显示它即可。如果是别的东西,你需要一个容器来装。例如,您可能有一个
窗口
,其中包含
边框
元素,并执行以下操作:

var control = XamlReader.Load(rdr) as UserControl;
var window = new MyHostWindow();
window.ContentBorder.Child = control;

如果您实际上不知道XAML中元素的类型,通常可以使用
FrameworkElement
,它是所有可视元素的基类,尽管您不会从中获得特定于窗口的行为。

我同意这一点;但是,您应该能够使用Activator.CreateInstance(类型);而不是找方法的麻烦。类似于:var win=(Window)Activator.CreateInstance(.GetType();若Window的构造函数有参数,你们会怎么做?他说他有一个包含他需要的窗口的XAML文件。只要它是一个有效的XAML文件,XamlReader就会构造它。XALM元素必须有一个无参数构造函数和公共属性,因为XAML就是这样工作的。如果你想构造一个需要构造函数中参数的可视元素,你不能在XAML和XamlReader无法工作。
var control = XamlReader.Load(rdr) as UserControl;
var window = new MyHostWindow();
window.ContentBorder.Child = control;