2009-05-26 5 views
2

Ich habe eine benutzerdefinierte Designer-Klasse implementiert, die von DocumentDesigner erbt. Die Standard Form-Klasse in .NET Framework verwendet die FormDocumentDesigner-Klasse (ebenfalls von DocumentDesigner erben), aber da diese Klasse intern ist, ist es nicht möglich, von ihr zu erben und ihr Verhalten anzupassen, kopierte ich die Logik in dieser Klasse mit einem Reflektor und eingefügt es in meiner benutzerdefinierten Designer-Klasse (so dass das Standard-Entwurfszeitverhalten für mein Formular dem Standardformular entspricht).Benutzerdefinierte Designer-Klasse für ein .NET Windows Form-Problem

Alles funktioniert gut außer einer Sache: In der Initialize-Methode meiner benutzerdefinierten Designer-Klasse möchte ich ein ToolStrip-Steuerelement einfügen, so dass jedes Steuerelement während der Entwurfszeit geöffnet und sichtbar ist und bearbeitet werden kann. Das Problem besteht darin, dass die Initialize-Methode jedes Mal aufgerufen wird, wenn Sie das Formular im Designer schließen und erneut öffnen, wodurch jedes Mal eine neue Instanz des ToolStrip-Steuerelements erstellt und in der Controls-Auflistung des Formulars hinzugefügt wird. Ich bin auf der Suche nach einer Möglichkeit zu überprüfen, ob bereits ein ToolStrip-Steuerelement in den Code serialisiert ist und vermeiden Sie eine weitere hinzufügen.

Bis jetzt habe ich herausgefunden, dass ich das LoadComplete-Ereignis des IDesignerHost verwenden und überprüfen kann, ob ein ToolStrip in der Controls-Auflistung des Formulars vorhanden ist. Bessere Ideen wären jedoch wünschenswert.

Danke für Ihre Zeit! :-)

Antwort

1

Nun, das LoadComplete-Ereignis ist der richtige Punkt. Normalerweise überprüfe ich die Loading-Eigenschaft, um zu überprüfen, ob die Initialisierung beim Laden erfolgt oder ob sie nach dem Laden aufgerufen wurde.

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) 
    { 
     ... 
    } 
} 

Ein weiterer Ansatz ist es, eine Komponente zu erstellen, die Sie in ein Formular fallen können und einen Designer für die Komponente erstellen, anstatt die Formdesigner neu zu erstellen. Vom Komponenten-Designer können Sie das übergeordnete Formular mithilfe der Eigenschaft _host.RootComponent abrufen.

Verwandte Themen