Commanding
Commanding-esimerkki (Commanding.zip)
Routed Commands aktivoivat/disabloivat niihin liittyvät käyttöliittymäkontrollit automaattisesti sen perusteella ilmoittaakö niihin liittyvä käsittelijä komennon olevan käytössä tai pois käytöstä
- Komento voi olla valmiiksi määritelty vakiokomento tai aivan oma
- Samaa komentoa voidaan käyttää monessa paikassa (menu, painike, näppäinyhdistelmä jne.)
- CanExecute-metodi määrää onko komento suoritettavissa vai ei (e.CanExecute = True;)
- Executed-sisältää komennon varsinaisen toiminnallisuuden
Komennot ja niiden käyttäminen esitellään hyvin seuraavissa dokumenteissa: Introduction to WPF Commands Commanding Overview
Routed Commandeja käyttävien elementtien ei tarvitse suoraan liittyä vastaaviin käsittelijöihin
Komento:
<Button Name="komentopainike" Command="ApplicationCommands.Save">Save</Button>
<Button Command="Save" CommandTarget="{Binding ElementName=komentopainike}" >Save</Button>
<Window.InputBindings>
<KeyBinding Key="O"
Modifiers="Control"
Command="ApplicationCommands.Open" />
</Window.InputBindings>
<StackPanel>
<Menu>
<MenuItem Command="ApplicationCommands.Paste"
CommandTarget="{Binding ElementName=mainTextBox}" />
</Menu>
<TextBox Name="mainTextBox"/>
</StackPanel>
<!-- Oma komento -->
<Window.CommandBindings>
<CommandBinding Command="{x:Static custom:Window1.CustomRoutedCommand}"
Executed="ExecutedCustomCommand"
CanExecute="CanExecuteCustomCommand" />
</Window.CommandBindings>
Komennon käsittelijä:
<UserControl ...>
<UserControl.CommandBindings>
<CommandBinding Command="ApplicationCommands.Save" CanExecute="OnCanExecute" Executed="OnExecute"/>
</UserControl.CommandBindings>
</UserControl>
- CanExecute määrää onko komento suoritettavissa vai ei (e.CanExecute = True;)
- Executed suorittaa varsinaisen toiminnon
KeyGesture OpenKeyGesture = new KeyGesture(
Key.O,
ModifierKeys.Control);
KeyBinding OpenCmdKeybinding = new KeyBinding(
ApplicationCommands.Open,
OpenKeyGesture);
this.InputBindings.Add(OpenCmdKeybinding);
CommandBinding OpenCmdBinding = new CommandBinding(
ApplicationCommands.Open,
OpenCmdExecuted,
OpenCmdCanExecute);
// yhdistetään komento ikkunaan
this.CommandBindings.Add(OpenCmdBinding);
public static RoutedCommand CustomRoutedCommand = new RoutedCommand();
//CommandBinding customCommandBinding = new CommandBinding(
// CustomRoutedCommand, ExecutedCustomCommand, CanExecuteCustomCommand);
// käytetään lyhyyden vuoksi samoja metodeja mitä open-komennon kanssa
CommandBinding customCommandBinding = new CommandBinding(
CustomRoutedCommand, OpenCmdExecuted, OpenCmdCanExecute);
this.CommandBindings.Add(customCommandBinding);
Button CustomCommandButton = new Button();
CustomCommandButton.Command = CustomRoutedCommand;
void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
String command, targetobj;
command = ((RoutedCommand)e.Command).Name;
targetobj = ((FrameworkElement)target).Name;
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj);
}
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}

Käyttäjien kommentit