Zamykanie okna klawiszem ESC

Często spotykamy się z tym, że w różnych programach, w których wyświetlają się okna dialogowe (pop-up) można je zamykać m.in klawiszem ESC. Jest to fajne, szybkie i intuicyjne. Natomiast denerwuje mnie, gdy jakiś program nie ma takiej funkcjonalności i trzeba wycelować kursorem w krzyżyk albo klawisz Close.

W tym poście opiszę jak przy pomocy kawałka kodu zamykać okna w Silverlight’cie, aczkolwiek w ten lub analogiczny sposób można to zrobić to WPF czy np. WindowsForms.

Silverlight – ChildWindow

Standardowe okno dialogowe w Silverlight to klasa ChildWindow (lub RadWindow jeśli używamy kontrolek Telerika). W każdym razie po utworzeniu okna, musimy zacząć na nim „nasłuchiwać” klawiszy. Robimy to w klasie naszego okna, nadpisując metodę OnKeyDown lub OnKeyUp (w zależności czy interesuje nas zamknięcie już przy wciśnięciu klawisza czy po wciśnięciu i puszczeniu klawisza):

protected override void OnKeyDown(KeyEventArgs e)
{
	base.OnKeyDown(e);
}

W metodzie OnKeyDown sprawdzamy jaki klawisz został wciśnięty (parametr KeyEventArgs) i jeśli będzie to akurat ESC to ustawiamy odpowiedni wynik oraz zamykamy okienko:

protected override void OnKeyDown(KeyEventArgs e)
{
	if (e.Key == Key.Escape)
	{
		e.Handled = true;
		DialogResult = false;
		Close();
	}
	base.OnKeyDown(e);
}

ESC dla wszystkich okien

Jeśli chcesz aby wszystkie twoje okna zachowywały się w ten sposób to oczywiście możesz wklejać powyższą metodę do każdego ChildWindow. Ale można to zrobić lepiej.

Utwórz (chyba, że już masz) dodatkową klasę między: ChildWindow, a twoim oknem i nazwij ją np. MyChildWindowBase.

Niech MyChildWindowBase dziedziczy po ChildWindow, a twoje okno niech dziedziczy po MyChildWindowBase zamiast po ChildWindow jak wcześniej. Teraz masz taki łańcuszek 3 klas.

ChildWindow <- MyChildWindowBase <- Okno1

ChildWindow <- MyChuldWindowBase <- Okno2

W MyChildWindowBase nadpisz OnKeyDown (lub skopiuj powyższy kod) i gotowe. Teraz każde okno które będzie dziedziczyć po MyChildWindowBase automatycznie implementuje zamykanie klawiszem ESC 🙂

Advertisements

4 thoughts on “Zamykanie okna klawiszem ESC

  1. Pingback: dotnetomaniak.pl

  2. W Windows Forms jest to jeszcze prostsze. Zakładając, że w oknie jest przycisk, który powoduje anulowanie operacji i zamknięcie danego okna, należy go przypisać do jednej z właściwości Formy – CancelButton. Można to zrobić albo w konstruktorze:
    this.CancelButton = m_buttonCancel;
    albo w Designerze, pole jest we właściwościach Form.

    • W Silverlight’cie również można się podłączyć pod przycisk zamykający. To co-kto będzie chciał zrobić na ESC to już jego sprawa 🙂

  3. Pingback: Obsługa kombinacji klawiszy | Wojciech Poniatowski [PL]

Możliwość komentowania jest wyłączona.