2010-04-05 3 views
9

Ich schreibe ein UserControl. Ich möchte das Benutzersteuerelement zeichnen, wenn die Größenänderung erfolgt ist. Ich kann kein Ereignis finden, das "ResizeEnd" eines Windows-Formulars entspricht."ResizeEnd" entspricht für usercontrols

Gibt es ein äquivalentes Ereignis für Benutzersteuerelemente?

Bitte beachten Sie, dass in diesem Fall das übergeordnete Steuerelement des Benutzersteuerelements selbst ein UserControl ist, also kann ich es nicht konvertieren (übergeordnete Benutzersteuerelement) in ein Formular. Da ich ein Framework verwende, kann ich nicht auf das Formular zugreifen, auf dem dieses Benutzersteuerelement angezeigt wird.

+0

Haben Sie Ihr Problem gelöst? Wenn die Antwort ja ist, wie? Ich habe die gleichen Probleme und schrieb eine mögliche Lösung [http://stackoverflow.com/questions/7584307/user-control-resize] – Marco

Antwort

7

Es gibt keine Entsprechung. Ein Formular hat eine modale Dimensionierungsschleife, die gestartet wird, wenn der Benutzer auf die Kante oder eine Ecke des Formulars klickt. Untergeordnete Steuerelemente können auf diese Weise nicht in der Größe geändert werden. Es werden nur Änderungen an der Size-Eigenschaft angezeigt.

Lösen Sie dies, indem Sie Ihrem Benutzersteuerelement eine Sizing-Eigenschaft hinzufügen. Das Formular kann es leicht von seinen OnResizeBegin/End() - Überschreibungen zuweisen. Im Anschluss an die Parent-Eigenschaft in dem Load-Ereignisse des UC, bis Sie das Formular finden, ist auch möglich:

public bool Resizing { get; set; } 

private void UserControl1_Load(object sender, EventArgs e) { 
    if (!this.DesignMode) { 
    var parent = this.Parent; 
    while (!(parent is Form)) parent = parent.Parent; 
    var form = parent as Form; 
    form.ResizeBegin += (s, ea) => this.Resizing = true; 
    form.ResizeEnd += (s, ea) => this.Resizing = false; 
    } 
} 
+0

Im Mai Fall Elternformular ist auch ein Benutzer Steuerelement. Daher kann das übergeordnete Steuerelement nicht in ein Formular umgewandelt werden. – Ram

+0

@Ram: Deshalb ist die While-Schleife da. Hast Du es versucht? –

+0

@Hans Passant: Dieser Beitrag wurde mir nach meinem Post [hier] (http://stackoverflow.com/questions/7584307/user-control-resize) gegeben. Das Problem ist (mit Ihrer Antwort) Eltern wird während des Zyklus Null und alles scheitert. Selbst die Verwendung von 'this.FindForm()' gibt mir null. Hast du eine andere Idee? – Marco

1

Die Hans-Lösung arbeitet (und es sieht aus wie es ist der einzige Weg, es zu tun), aber es ist erforderlich, diese Handler in jeder Form, die Ihre Kontrolle verwendet (was nicht immer akzeptabel ist).

So können Sie eine einfache Problemumgehung verwenden, Starten des Timers bei der Größenänderung auftritt. Jedes Mal, wenn die Größe geändert wird, wird Ihr Timer neu gestartet. Und nur wenn es für einige Zeit keine Größenänderungen gibt (_timer.Interval), wird die ResizeFinished() -Methode aufgerufen.

private Timer _timer; 

    public MyControl() 
    { 
     _timer = new Timer(); 
     _timer.Interval = 500; 
     _timer.Tick += (sender, e) => ResizeFinished(); 
    } 

    protected override void OnSizeChanged(EventArgs e) 
    { 
     base.OnSizeChanged(e); 
     _timer.Start(); 
    } 

    private void ResizeFinished() 
    { 
     _timer.Stop(); 
     // Your code 
    } 

Wie Sie sehen können, wird Ihr Code erst nach 500 ms aufgerufen, nachdem der Aufruf der letzten Größe geändert wurde.