Po krótkiej przerwie powracamy do tematu przygotowań do egzaminu z WPF. Dzisiejszy temat to komendy (commands).
Komendy to nowość, która znalazła się w WPFie (ale sama koncepcja nie jest nowa), a która dostarcza luźno powiązany połączenie pomiędzy akcją a jej uruchomieniem. Dla przykładu: Standardowa aplikacja ma wiele ‘miejsc’, które umożliwiają wklejenie tekstu (Paste). Menu główne, menu kontekstowe, toolbar itp. Zapewne, każdy z nas zaimplementowałby to ładnie jako jedna metoda, która jest odpowiednio wołana w tych miejscach.

Jednak za pomocą komend, możemy to uzyskać w jeszcze prostszy sposób. Komendy implementują prosty interface (ICommand z trzemam metodami: Execute, CanExecute oraz CanExecuteChange – więcej poniżej) a cała ich siła w tym, że multum z nich już jest dostępna w WPFie. Dodatkowo część standardowych kontrolek ma wsparcie dla komend, co czynie jest jeszcze bardziej użytecznymi

Komendy wbudowane

Jest ich sporo…naprawdę sporo a wszystko podzielone na 5 kategorii.

ApplicationCommands

Lista dostępnych komend.

ComponentCommands

Lista dostępnych komend.

MediaCommands

Lista dostępnych komend.

NavigationCommands

Lista dostępnych komend.

EditingCommands

Lista dostępnych komend.

Jak tego używać?

Jeśli już przebrnęliśmy przez długą listę komend, warto zobaczyć jak tego użyć w praktyce.

Z kodu:

help.Command = ApplicationCommands.Help;

oraz z XAML’a:

<Button Content=”Pomoc” x:Name=”help” Command=”ApplicationCommands.Help” />

Jeśli jednak uruchomimy taki przykładowy kod, przycisk będzie permanentnie zablokowany. Jeśli się nad tym zastanowić to jest to oczywiste. Akurat ta komenda nie wie, kiedy Pomoc może być aktywna a kiedy nie. Aby to określić musimy zdefiniować CommandBinding.

CommandBindings.Add(new CommandBinding(ApplicationCommands.Help, HelpExecuted, CanExecute));

void CanExecute(object sender, CanExecuteRoutedEventArgs e)

{

  // e.CanExecute ustawiamy na true jeśli komenda ma być aktywna

}

 

void HelpExecuted(object sender, ExecutedRoutedEventArgs e)

{

    // uruchamiamy co mamy do zrobienia

}

Zanim przejdziemy do dalszej części, warto wspomnieć, że każda komenda posiada zalokalizowaną pod dany język nazwę, którą można użyć zamiast ustawionego na sztywno tekstu. Dzięki temu przynajmniej część naszej aplikacji będzie od razu przetłumaczona. Robi się to banalnie prosto:

help.Content = ApplicationCommands.Help.Text;

Nasze własne komendy

Tak jak już pisałem wcześniej komendy implementują prosty interface ICommand. Aby stworzyć własną komendę wystarczy go zaimplementować:

  • Execute – wołana, gdy akcja komendy ma być uruchomiona
  • CanExecute – wołana, gdy następuje sprawdzenie czy dana komenda może być uruchomiona czy nie.
  • CanExecuteChanged – powinniśmy wołać ten event, gdy stan komendy zmienia się

Kontrolki wbudowane

Prawdziwą siłę komend, możemy podziwiać w połączeniu ze standardowymi kontrolkami np. TextBox’em. Wystarczy bowiem wpisać poniższy kod:

<StackPanel Orientation=”Horizontal” Height=”30″>

    <Button Command=”Cut” CommandTarget=”{Binding ElementName=textBox}” Content=”Cut” />

    <Button Command=”Paste” CommandTarget=”{Binding ElementName=textBox}” Content=”Paste”/>

    <TextBox x:Name=”textBox” Width=”220″ />

StackPanel>

A przyciski Cut i Paste będą zachowywać się zgodnie ze stanem kontrolki TextBox.

Skróty klawiaturowe

Na koniec jeszcze odnośnie skrótów klawiaturowych. Aby podpiąć daną kombinację klawiszy pod daną komendę wystarczy jedna prosta linijka:

InputBindings.Add(new InputBinding(ApplicationCommands.Help, new KeyGesture(Key.H)));

To chyba wszystko jeśli chodzi o komendy. Następnym razem będzie o: Configure page-based navigation – cz.1 i cz. 2. Do zobaczenia.

Bibliografia: WPF Unleashed, MSDN