2013-04-01 14 views
5

W mojej aplikacji formularzy systemu Windows napisanej w języku C# Mam kilka przycisków. Kiedy mysz użytkownika unosi się nad przyciskiem, chcę zmienić granicę przycisku.Udostępnianie procedury obsługi zdarzeń dla wielu formantów

Obecnie mam wiele wystąpień następujących (a kopia dla każdego przycisku):

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; 
} 

Ponieważ mam dużo przycisków, kod, aby zmienić kolor obramowania przycisku rozgrywa się wiele przestrzeń.

Czy jest jakiś prostszy sposób, aby to zrobić?

Odpowiedz

5

Należy podłączyć się pojedynczy MouseEnter i MouseLeave do każdej kontroli, który potrzebuje tej funkcji (zamiast pisać nową wersję każdej metody dla każdej kontroli). Zakładając, że korzystasz z Visual Studio, możesz to zrobić, zmieniając nazwę metody docelowej dla wydarzenia, w okienku właściwości każdego przycisku. Jeśli najpierw napiszesz poniższy kod, ta metoda pojawi się na listach rozwijanych zdarzeń obiektu: MouseEnter i MouseLeave.

Kod będzie wtedy trzeba sprawdzić który przycisk, z którego został zwolniony wydarzenie w następujący sposób:

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; 
} 

Przypuszczam oldColor jest globalnym? To może się zsynchronizować, jeśli wydarzy się coś "nieparzystego", gdy zdarzenie MouseEnter zostanie wywołane dla innego przycisku, zanim zostanie przechwycone odpowiednie MouseLeave. Aby uczynić to bardziej niezawodnym, rozważałbym przechowywanie starego koloru na właściwości Button's .tag, tak aby był samowystarczalny.

Np

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; 
} 

(Znacznik jest w zasadzie hak, na których można oznakować „coś” odpowiednie do konkretnej instancji kontroli, że nie ma już nieruchomość za to od rodzaju Object który. oznacza, że ​​możesz oznaczyć wszystko tam, ale kiedy czytasz z niego, musisz go odesłać z powrotem do dowolnego typu, który tam umieścisz, ale ponieważ jest to Object możesz umieścić tam wszystko, w tym np. niestandardową klasę zawierającą wiele właściwości, tablicę itp., jeśli chcesz oznaczyć formant więcej niż jedną rzeczą).

+0

Dziękujemy! Dokładnie to, czego chciałem. – davidwroxy

+0

@davidwroxy Absolutnie moja przyjemność partnera, i dzięki za zaakceptować! Zauważam, że rzadko "akceptujesz" inne odpowiedzi, które (mogą) odpowiedzieć na twoje pytania. Jeśli masz chwilę, czy miałbyś/mogłabyś zaznaczać jako "zaakceptowane" te odpowiedzi (jeśli w ogóle), które rozwiązały twoje problemy i/lub głosowały te, które były dla ciebie użyteczne? – Sepster

+0

Właśnie skończyłem oznaczać odpowiedzi, które rozwiązały mój problem. Zapomniałem to zrobić. Dziękuję za przypomnienie. – davidwroxy

Powiązane problemy