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
ComponentCommands
MediaCommands
NavigationCommands
EditingCommands
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
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl