按名称访问窗口

时间:2012-01-31 22:23:34

标签: wpf window find

我是来自Delphi世界的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>

因此,当用户选择“库存数据”时,我会知道我想要对“Inventory.xaml”窗口进行“显示”......但我只有文字字符串“Inventory.xaml”

我将有数百种这样的表格,而且XML文件可能会不时变化 - 因此对我来说,使用标准代码无效

Dim window as New Inventory
window.Show

对于几百个窗口中的每一个。

我需要的是

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

我无休止地搜寻这个没有运气。

2 个答案:

答案 0 :(得分:1)

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

http://msdn.microsoft.com/en-us/library/y0cd10tb.aspx
http://msdn.microsoft.com/en-us/library/h93ya84h.aspx
http://msdn.microsoft.com/en-us/library/6ycw1y17.aspx

答案 1 :(得分:0)

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

var rdr = XmlReader.Create(File.Open("Inventory.xaml"));
var window = XamlReader.Load(rdr) as Window;
window.Show();

XamlReader.Load将返回XAML中指定的实际顶级元素;如果它是Window你只能.Show它。如果它是其他内容,您需要一个容器来放置它。例如,您可能有一个Window,其中包含Border元素并执行:

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

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