2013-04-01 20 views
5

In meiner Windows Forms-Anwendung in C# geschrieben habe ich eine Reihe von Schaltflächen. Wenn die Maus des Benutzers über eine Schaltfläche schwebt, möchte ich, dass sich der Rand der Schaltfläche ändert.Teilen Sie einen Ereignishandler über mehrere Steuerelemente hinweg

Zur Zeit habe ich mehrere Instanzen der folgenden (eine Kopie für jede Taste):

private void btnStopServer_MouseEnter(object sender, EventArgs e) 
{ 
    oldColor = btnStopServer.FlatAppearance.BorderColor; 
    btnStopServer.FlatAppearance.BorderColor = mouseOverColor; 
} 

private void btnStopServer_MouseLeave(object sender, EventArgs e) 
{ 
    btnStopServer.FlatAppearance.BorderColor = oldColor; 
} 

Da ich eine Menge Knöpfe haben, wird der Code die Farbe der Schaltfläche Grenze zu ändern, nimmt eine Menge Raum.

Gibt es einen einfacheren Weg, dass ich das tun könnte?

Antwort

5

Sie sollten ein einzelnes MouseEnter und MouseLeave mit jedem Steuerelement verdrahten, das diese Funktionalität benötigt (anstatt eine neue Version jeder Methode für jedes Steuerelement zu schreiben). Angenommen, Sie verwenden Visual Studio, können Sie dies tun, indem Sie den Namen der Zielmethode für das Ereignis im Eigenschaftenbereich der jeweiligen Schaltfläche ändern. Wenn Sie zuerst den folgenden Code schreiben, wird diese Methode in den Dropdown-Listen der Ereignisse MouseEnter und MouseLeave angezeigt.

Der Code würde dann brauchen , die Taste auf der das Ereignis wurde gefeuert zu überprüfen, wie folgt:

private void btnWithHoverBorder_MouseEnter(object sender, EventArgs e) 
{ 
    Button eventButton = (Button) sender; 
    oldColor = eventButton.FlatAppearance.BorderColor; 
    eventButton.FlatAppearance.BorderColor = mouseOverColor; 
} 

private void btnWithHoverBorder_MouseLeave(object sender, EventArgs e) 
{ 
    Button eventButton = (Button) sender; 
    eventButton.FlatAppearance.BorderColor = oldColor; 
} 

Ich nehme an oldColor ein globaler ist? Dies kann nicht mehr synchron sein, wenn etwas "Ungewöhnliches" passiert, bei dem Ihr MouseEnter Ereignis für eine andere Taste ausgelöst wird, bevor die entsprechende MouseLeave abgefangen wird. Um dies robuster zu machen, würde ich in Betracht ziehen, die alte Farbe auf der .tag-Eigenschaft der Schaltfläche zu speichern, sodass sie eigenständig ist.

ZB:

private void btnWithHoverBorder_MouseEnter(object sender, EventArgs e) 
{ 
    Button eventButton = (Button) sender; 
    eventButton.tag = eventButton.FlatAppearance.BorderColor; 
    eventButton.FlatAppearance.BorderColor = mouseOverColor; 
} 

private void btnWithHoverBorder_MouseLeave(object sender, EventArgs e) 
{ 
    Button eventButton = (Button) sender; 
    eventButton.FlatAppearance.BorderColor = (Color)eventButton.tag; 
} 

(Der Tag ist im Grunde ein Haken, an die „alles“ zu einer bestimmten Instanz einer Kontrolle zu markieren, dass es für die nicht bereits eine Eigenschaft Es ist vom Typ Object die. bedeutet, dass Sie dort alles markieren können, aber wenn Sie davon lesen, müssen Sie es auf den Typ zurückgeben, den Sie dort platziert haben, aber da es sich um eine Object handelt, können Sie dort auch eine benutzerdefinierte Klasse einfügen, die mehrere enthält Eigenschaften, oder ein Array, usw., wenn Sie ein Steuerelement mit mehr als einer Sache markieren müssen).

+0

Danke! Genau das, was ich wollte. – davidwroxy

+0

@davidwroxy Absolut mein Vergnügen Kumpel, und danke für das Akzeptieren! Ich nehme zur Kenntnis, dass Sie selten andere Antworten "akzeptiert" haben, die Ihre Fragen beantwortet haben. Wenn Sie einen Moment Zeit haben, würden Sie diese Antworten (falls vorhanden) als "akzeptiert" markieren, die Ihre Probleme gelöst und/oder diejenigen, die Ihnen nützlich waren, verbessert haben? – Sepster

+0

Ich habe gerade die Antworten markiert, die mein Problem gelöst haben. Ich habe vergessen, das zu tun. Danke, dass du mich daran erinnerst. – davidwroxy

Verwandte Themen