WPF Befehle (Commands)
Transcription
WPF Befehle (Commands)
WPF Commands Befehlsausführung Das Command-Konzept der WPF Dr. Beatrice Amrhein Überblick Einführung Die wichtigsten Commands Commands in Menus und ToolBars Vordefinierte Commands Eigene Commands Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 2 Einführung Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 3 Einführung Commands werden (ähnlich wie Events) an eine Quelle gebunden. Commands gehören (im Gegensatz zu Events) stets zu einem Command-Ziel, üblicherweise zu einer Textbox oder einem (Teil) Fenster. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 4 Definition Command: Ein Kommando implementiert eine bestimmte Aufgabe (speichern, lesen, kopieren, einfügen, …) Command-Quelle: Die Komponente welche den Command anstösst, z.B. ein Button oder ein Menu-Punkt Command-Ziel: Das Element, auf dem das Kommando ausgeführt wird, z.B. eine TextBox Command-Bindung: Die Verknüpfung des Kommandos mit der Anwendungslogik. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 5 Die wichtigsten Commands Command Bedeutung Verwendung Cut Ausschneiden von Text aus einer TextBox Registrierung an Menu oder Toolbar-Button fertig Copy Kopieren von Text aus einer TextBox Registrierung an Menu oder Toolbar-Button fertig Paste Einfügen von Text in eine TextBox Registrierung an Menu oder Toolbar-Button fertig Undo Rückgängig machen der letzten Eingabe Registrierung an Menu oder Toolbar-Button fertig Redo Rückgängig machen des letzten Undo Befehls Registrierung an Menu oder Toolbar-Button fertig Open Öffnen eines neuen Files Selber implementieren Save Speichern in ein File Selber implementieren Print Drucken eines Fensters (Text, Tabelle, …) Selber implementieren Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 6 Commands auf TextBoxen Für Textboxen sind die WPF-Befehle Copy, Cut, Paste, Undo und Redo bereits implementiert. Durch Klicken auf einen Button in der ToolBar oder einem Menü wird der Befehl automatisch ausgeführt und von der TextBox behandelt, welche aktuell den Fokus hat. Für Open, Save, New oder Print gibt es keine automatische Programmlogik, diese Befehle müssen darum selber programmiert werden. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 7 Verwenden von vordefinierten Commands 8 Vordefinierte Text-Commands im Menu <Window x:Class="cmd1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="208" Width="280"> <DockPanel> <Menu DockPanel.Dock="Top"> <MenuItem Header="Bearbeiten"> <MenuItem Command="Cut"/> <MenuItem Command="Copy"/> <MenuItem Command="Paste"/> <Separator/> <MenuItem Command="Undo"/> <MenuItem Command="Redo"/> </MenuItem> </Menu> Das Erzeugen eines Bearbeiten-Menus mit Cut, Copy, Paste, … geschieht einfach durch Setzen des entsprechenden Commands. Da diese Commands für Text-Komponenten in C# bereits implementiert sind, ist damit bereits alle Arbeit erledigt, das Menu funktioniert. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 9 Vordefinierte Text-Commands in der ToolBar <ToolBarTray DockPanel.Dock="Top" > <ToolBar> <Button Command="Cut"><Image imagePfad Cut.gif"/></Button> <Button Command="Copy"><Image imagePfad Copy.gif"/></Button> <Button Command="Paste"><Image imagePfad Paste.gif"/></Button> <Button Command="Undo"><Image imagePfad Undo.gif"/></Button> <Button Command="Redo"><Image imagePfad Redo.gif"/></Button> </ToolBar> </ToolBarTray> <TextBox AcceptsReturn="True" Margin="2" FontSize="14"/> </DockPanel> </Window> Das Erzeugen einer ToolBar mit Cut, Copy, Paste, … ist genau so einfach. Es genügt das Setzen des entsprechenden Commands. In der ToolBar werden für die Buttons üblicherweise Bilder (Icon) statt Texte benutzt. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 10 Exkurs: Tooltips <Button Command="Cut" ToolTip="Selektierten Text ausschneiden"> <Image> <Image.Source> <BitmapImage UriSource="C:\Images\Cut24.gif"/> </Image.Source> </Image> </Button> <Button Command="Copy" ToolTip="Selektierten Text kopieren"> <Image> <Image.Source> <BitmapImage UriSource="C:\Images\Copy24.gif"/> </Image.Source> </Image> </Button> Wenn Bilder (Icons) statt Texte auf Buttons verwendet werden, ist es wichtig, ein Tooltip (Hilfetext) zur Verfügung zu stellen. Dieser wird automatisch angezeigt, sobald die Maus über den Button fährt. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 11 Exkurs: Bilder inaktiv setzen <Button Command="Cut" ToolTip="Selektierten Text ausschneiden"> <Image> <Image.Source> <BitmapImage UriSource="C:\Images\Cut24.gif"/> </Image.Source> <Image.Style> <Style TargetType="Image"> <Style.Triggers> <Trigger Property="IsEnabled" Value="False"> <Setter Property="Opacity" Value="0.5" /> </Trigger> </Style.Triggers> Gewisse Buttons inaktiv Alle Buttons aktiv </Style> </Image.Style> </Image> </Button> Die Icons in der ToolBar sollen anzeigen, ob der Button im Moment aktiv oder inaktiv gesetzt ist. Diese geschieht durch obige Anweisung. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 12 Implementieren von eigenen Commands Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 13 Nicht vordefinierter Command: Help Für Befehle wie New, Open, Save oder Help existiert in C# kein implementierter Command. Darum muss dieser von uns selber programmiert werden. Es braucht dazu zwei Methoden in der Klasse MainWindow.xaml.cs: private void Help_Ausfuehren(object sender, ExecutedRoutedEventArgs e) { MessageBox.Show("Hilfe!!!"); } private void Help_Aktiv(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 14 Command in MainWindow.xaml vorbereiten <Window x:Class="cmd2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Da Help kein bereits Title="MainWindow" Height="208" Width="280"> existierender Befehl ist, muss das CommandBinding in xaml <Window.CommandBindings> zuerst definiert werden. <CommandBinding Command="Help" CanExecute="Help_Aktiv" Hier werden die beiden Executed="Help_Ausfuehren"/> vorbereiteten Methoden registriert. </Window.CommandBindings> <Menu DockPanel.Dock="Top"> <MenuItem Header="Datei"> <MenuItem Command="New"/> <MenuItem Command="Open"/> <MenuItem Command="Save"/> </MenuItem> <MenuItem Header="Hilfe"> <MenuItem Command="Help"/> </MenuItem> </Menu> Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 15 Help Command benutzen Sobald der Help Menu-Eintrag (oder die Taste F1) gedrückt wird, wird die angebundene Methode Help_Ausfuehren aufgerufen, welche die MessageBox öffnet <CommandBinding Command="Help" CanExecute="Help_Aktiv" Executed="Help_Ausfuehren"/> private void Help_Ausfuehren(object sender, ExecutedRoutedEventArgs e) { MessageBox.Show("Hilfe!!!"); } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 16 Nicht vordefinierter Command: Save Für Befehle wie Save oder Open kann analog vorgegangen werden. Im File MainWindow.xaml.cs werden die Methoden Save_Ausfuehren und Save_Aktiv implementiert. private void Save_Ausfuehren(object sender, ExecutedRoutedEventArgs e) { meinText.SaveToFile(); MessageBox.Show("Text ins File "+ fileName +" gespeichert"); } private void Save_Aktiv(object sender, CanExecuteRoutedEventArgs e) { e.CanExecute = true; } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 17 Save Command in MainWindow.xaml vorbereiten <Window x:Class="cmd2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="208" Width="280"> Das CommandBinding für den Save <Window.CommandBindings> Befehl. <CommandBinding Command="Save" CanExecute="Save_Aktiv" Die Methoden Save_Ausfuehren und Save_Aktiv werden für den Executed="Save_Ausfuehren" /> Command registriert. <CommandBinding Command="Help" CanExecute="Help_Aktiv" Executed="Help_Ausfuehren"/> </Window.CommandBindings> <Menu DockPanel.Dock="Top"> <MenuItem Header="Datei"> <MenuItem Command="New"/> <MenuItem Command="Open"/> <MenuItem Command="Save"/> </MenuItem> Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 18 Save Command Implementieren Der Save Befehl verlangt etwas mehr Programmier-Logik als der Help Befehl im ersten Beispiel. Es wird erwartet, dass der Text-Inhalt der TextBox tatsächlich in ein File gespeichert wird. Wir benötigen dafür eine Klasse MeinText, welche den TextInhalt der TextBox als Eigenschaft (Property) verwaltet. public partial class MainWindow : Window { const String fileName = "C:\\tmp\\Text.txt"; MeinText meinText; public MainWindow() { InitializeComponent(); meinText = new MeinText(fileName); DataContext = meinText; } Der Name des Files. Die Daten Klasse MeinText, welche als DataContext benutzt werden soll. Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 19 Save Command implementieren Sobald der Save Menu-Eintrag (oder Ctrl+S) gedrückt wird, wird die angebundene Methode Save_Ausfuehren aufgerufen, welche die Methode SaveToFile in der Klasse MeinText ausführt. <CommandBinding Command="Save" CanExecute="Save_Aktiv" Executed="Save_Ausfuehren"/> private void Save_Ausfuehren(object sender, ExecutedRoutedEventArgs e) { meinText.SaveToFile(); MessageBox.Show("Text ins File "+ fileName +" gespeichert"); } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 20 Die Klasse MeinText (DataContext) public class MeinText { private String fileName; Der Name des Files. public MeinText(String fn) { this.fileName = fn; } Der Konstruktor speichert den File Namen Die Eigensschaft TextInput speichert den Text der TextBox. private String input; public String TextInput { get { return input; } set {input = value; } } public void SaveToFile() { File.WriteAllText(fileName, input); } Die Methode SaveToFile speichert den Text der TextBox in das File. } Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 21 Save Command benutzen Der Inhalt der TextBox muss mit der Property TextInput der Klasse MeinText vor dem Speichern synchronisiert werden. Damit alle Text-Änderungen der TextBox mit TextInput synchronisiert (zwischengespeichert) werden, muss eine Event-Methode für das TextChangeEvent an die TextBox verknüpft werden. private void TextBoxTextChanged(object sender, TextChangedEventArgs e) { meinText.TextInput = textBox.Text; } <TextBox AcceptsReturn="True" Margin="2" FontSize="14" Name="textBox" TextChanged="TextBoxTextChanged"/> Die Event-Methode für das TextChangedEvent (in MainWindow.xaml.cs) Die Event-Methode wird dann als Event-Handler an die TextBox registriert (in MainWindow.xaml). Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012 22