2010-06-03 76 views
3

项目A包含一个带启动各种报告的命令堆栈面板的WPF窗口(数据输入窗体)。该菜单是从数据库动态构建的列表。我试图做的是基于与菜单选项关联的CommandText启动相应的WPF窗口。我想创建一个接受WPF窗口(CommandText)名称的单个函数,并按名称启动窗口的一个新实例。按名称显示WPF窗口

我发现了如何在类上启动方法的例子,但似乎无法找到一个与窗口一起工作的方法。我知道这可以通过一个开关完成,只需映射所有的窗口,但有60-70,我试图避免膨胀。

我失败了多次尝试使用TypeOfActivator.CreateInstance。建议?这甚至有可能吗?

回答

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”是在当前执行的程序集。

+0

我错误地认为名称空间和项目具有相同的名称。改变了命名空间前缀,它工作。 – jasonk 2010-06-03 17:49:22

3

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; 
}