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