2009-05-26 7 views
2

J'ai implémenté une classe de concepteur personnalisée qui hérite de DocumentDesigner. La classe Form standard dans le .NET Framework utilise la classe FormDocumentDesigner (héritant également de DocumentDesigner) mais comme cette classe est interne, il n'est pas possible d'en hériter et de personnaliser son comportement. J'ai copié la logique dans cette classe en utilisant un réflecteur. dans ma classe de concepteur personnalisé (de sorte que le comportement de temps de conception par défaut pour mon formulaire est conforme au formulaire standard). Tout fonctionne bien sauf une chose: dans la méthode Initialize de ma classe de concepteur personnalisé, je veux insérer un contrôle ToolStrip de sorte que chaque fois que mon formulaire est ouvert pendant la conception, ce contrôle est visible et modifiable. Le problème est que la méthode Initialize est appelée chaque fois que vous fermez et rouvrez le formulaire dans le concepteur qui provoque chaque fois qu'une nouvelle instance du contrôle ToolStrip est créée et ajoutée dans la collection Controls du formulaire. Je cherche un moyen de vérifier s'il existe déjà un contrôle ToolStrip sérialisé dans le code et évite d'en ajouter un autre.Classe Designer personnalisée pour un problème .NET Windows Form

Jusqu'à présent, j'ai découvert que je pouvais utiliser l'événement LoadComplete de IDesignerHost et vérifier s'il y avait un ToolStrip dans la collection Controls du Formulaire. Cependant, de meilleures idées seraient appréciées.

Merci pour votre temps! :-)

Répondre

1

Eh bien, l'événement LoadComplete est le bon point. Je vérifie habituellement la propriété Loading pour vérifier si l'initialisation se produit pendant le chargement ou si elle a été appelée après le chargement.

IDesignerHost _host; 
Form _form; 

public override void Initialize(System.ComponentModel.IComponent component) 
{ 
    _form = component as Form; 
    _host = (IDesignerHost)this.GetService(typeof(IDesignerHost)); 
    if (_host != null) 
    {  
    if (_host.Loading) 
    { 
    _host.LoadComplete += new EventHandler(_host_LoadComplete); 
    } 
    else 
    { 
    initializeForm(); 
    } 
    } 
} 

void _host_LoadComplete(object sender, EventArgs e) 
{ 
    _host.LoadComplete -= new EventHandler(_host_LoadComplete); 
    initializeForm(); 
} 

void initializeForm() 
{ 
    if (_form!= null) 
    { 
     ... 
    } 
} 

Une autre approche est de créer un composant que vous pouvez déposer dans un formulaire et créer un concepteur pour le composant au lieu de recréer le FormDesigner. À partir du concepteur de composants, vous pouvez obtenir le formulaire parent à l'aide de la propriété _host.RootComponent.

Questions connexes