2010-06-03 7 views
3

Le projet A contient une fenêtre WPF (Data Entry Form) avec une pile de commandes qui lancent différents rapports. Le menu est une liste construite dynamiquement à partir d'une base de données. Ce que je tente de faire est de lancer la fenêtre WPF correspondante basée sur le CommandText associé au choix du menu. Je voudrais créer une seule fonction qui accepte le nom de la fenêtre WPF (CommandText) et lance une nouvelle instance de la fenêtre par son nom.Affichage d'une fenêtre WPF par son nom

J'ai trouvé des exemples de méthodes pour lancer des méthodes sur des classes, mais je n'arrive pas à trouver une méthode qui fonctionne avec une fenêtre. Je sais que cela peut être fait avec un interrupteur et juste cartographier toutes les fenêtres, mais il y en a 60-70 et j'essayais d'éviter les ballonnements.

Je suis échoué à plusieurs reprises en essayant d'utiliser le TypeOf et Activator.CreateInstance. Suggestions? Est-ce seulement possible?

Répondre

1

Vous pouvez essayer ceci:

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

Le code ci-dessus suppose que la fenêtre est appelée « CreateWindow.MyWindow » (avec préfixe d'espace de noms) et que le type « CreateWindow.MyWindow » est dans l'ensemble en cours d'exécution .

+0

J'ai supposé à tort que l'espace de noms et Project avaient le même nom. Changé le préfixe d'espace de noms et cela a fonctionné. – jasonk

3

L'activateur fonctionne bien pour moi. Quelle erreur avez-vous? Essayez si le code ci-dessous fonctionnera pour vous

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