我是来自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
我无休止地搜寻这个没有运气。
答案 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的行为