项目A包含一个WPF窗口(数据输入表单),其中包含用于启动各种报告的堆栈面板命令。菜单是来自数据库的动态构建列表。我正在尝试做的是基于与菜单选项关联的CommandText启动相应的WPF窗口。我想创建一个接受WPF窗口名称(CommandText)的函数,并按名称启动窗口的新实例。
我找到了如何在类上启动方法的示例,但似乎找不到适用于窗口的方法。我知道它可以通过一个开关来完成,只是映射所有窗口,但是有60-70,我试图避免臃肿。
我多次尝试使用TypeOf
和Activator.CreateInstance
失败了。建议?这甚至可能吗?
答案 0 :(得分:4)
Activator对我来说很好。你有什么错误?如果以下代码适合您,请尝试
private void Button_Click(object sender, RoutedEventArgs e)
{
Window wnd = (Window)CreateWindow("WpfApplication1.Window2");
wnd.Show();
}
public object CreateWindow(string fullClassName)
{
Assembly asm = this.GetType().Assembly;
object wnd = asm.CreateInstance(fullClassName);
if (wnd == null)
{
throw new TypeLoadException("Unable to create window: " + fullClassName);
}
return wnd;
}
答案 1 :(得分:1)
你可以试试这个:
string windowClass = "CreateWindow.MyWindow";
Type type = Assembly.GetExecutingAssembly().GetType(windowClass);
ObjectHandle handle = Activator.CreateInstance(null, windowClass);
MethodInfo method = type.GetMethod("Show");
method.Invoke(handle.Unwrap(), null);
上面的代码假定您的窗口名为“CreateWindow.MyWindow”(带有名称空间前缀),并且“CreateWindow.MyWindow”类型位于当前正在执行的程序集中。