jasonk
jasonk

Reputation: 1570

Displaying a WPF Window by name

Project A contains a WPF Window (Data Entry Form) with a stack panel of commands that launch various reports. The menu is a dynamically built list from a database. What I’m attempting to do is launch the corresponding WPF window based on the CommandText associated with the menu choice. I’d like to create a single function that accepts the name of the WPF Window (CommandText) and launches a new instance of the window by name.

I’ve found examples of how to launch methods on classes, but can’t seem to find a method that works with a window. I know it can be done with a switch and just map all the windows, but there are 60-70 and I was trying to avoid bloat.

I’m failed repeatedly trying to use the TypeOf and Activator.CreateInstance. Suggestions? Is this even possible?

Upvotes: 4

Views: 2852

Answers (2)

Andrii
Andrii

Reputation: 2462

Activator works fine for me. What error do you have? Try if below code will work for you

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

Upvotes: 4

user128300
user128300

Reputation:

You might try this:

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

The code above assumes that your window is called "CreateWindow.MyWindow" (with namespace prefix) and that the type "CreateWindow.MyWindow" is in the currently executing assembly.

Upvotes: 1

Related Questions