Wie oft wird ein UserControl-Handle neu erstellt?

8

Ich habe das UserControl.Load-Ereignis für winforms nachgeschlagen (gefunden hier ) auf msdn und habe diese Warnmeldung gesehen:

  

Das Load-Ereignis tritt auf, wenn das Handle für das Benutzersteuerelement erstellt wird.   In einigen Fällen kann dies dazu führen, dass das Load-Ereignis häufiger auftritt   als einmal. Das Load-Ereignis tritt beispielsweise auf, wenn das Benutzersteuerelement   wird geladen und erneut, wenn das Handle neu erstellt wird. (Eine Möglichkeit, dass a   Handle wird neu erstellt, indem die RecreateHandle-Methode aufgerufen wird   Wenn das Load-Ereignis mehr als einmal auftritt, sollten Sie dies tun   Setzen Sie einen beliebigen Initialisierungscode in den UserControl-Konstruktor   anstelle eines Load-Event-Handlers. Außerdem sollten Sie keine Daten hinzufügen   Bindungen an das UserControl in einem Load-Ereignishandler.

Meine Frage ist dann, was neben einem expliziten Aufruf von RecreateHandle dazu führt, dass das Handle für ein UserControl neu erstellt wird? Bevor ich das gelesen habe, habe ich immer alles eingegeben, was nur einmal im Load-Event passieren sollte. Auch (aus dem letzten Satz), wo ist der beste Ort, um Datenbindungen hinzuzufügen? Ist es wirklich wichtig, wenn ich RecreateHandle nicht anrufen werde?

    
TKTS 22.07.2011, 20:59
quelle

1 Antwort

7

Ja, das ist möglich. Es wird durch ein Problem mit der systemeigenen Windows CreateWindowEx () - API-Funktion verursacht. Dieser Aufruf spezifiziert Stilbits für das Fenster. Dieselben Style-Bits werden auch als Eigenschaften des Controls angezeigt. Problem ist, dass das Ändern dieser Eigenschaft CreateWindowEx () erfordert, um erneut aufgerufen zu werden. Das native Windows-Fenster für das Steuerelement wird zerstört und neu erstellt. Das hat Nebenwirkungen, einer von ihnen wird das Load-Ereignis erneut ausgeführt.

Demonstrieren Sie es mit einem Codebeispiel:

%Vor%

Kompilieren Sie das Steuerelement, und legen Sie es auf einem Formular ab. Fügen Sie eine Schaltfläche hinzu:

%Vor%

Beachten Sie, dass das Ausgabefenster bei jedem Klicken auf die Schaltfläche "onload" anzeigt.

Die RightToLeft-Eigenschaft ist die einzige, die ich mir für ein UserControl vorstellen kann, das dies tun wird. Es gibt viel mehr für eine Form. Diese Klasse verfügt jedoch über Code, der verhindert, dass die OnLoad-Methode mehr als einmal ausgeführt wird. Nicht sicher, warum sie das nicht für UserControl getan haben, wahrscheinlich weil es so selten ist. Fühlen Sie sich frei, es zu ignorieren. Und favorisieren Sie immer den Konstruktor über das Load-Ereignis, es sei denn, Sie interessieren sich für die Fenstergröße.

    
Hans Passant 22.07.2011, 22:05
quelle