WPF Commands Befehlsausführung - sws.bfh.chamrhein/Skripten/Info2/07.Commands.pdf ·...

22
WPF Commands Befehlsausführung Das Command-Konzept der WPF Dr. Beatrice Amrhein

Transcript of WPF Commands Befehlsausführung - sws.bfh.chamrhein/Skripten/Info2/07.Commands.pdf ·...

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

2Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Einführung

3Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

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.

4Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

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.

5Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die wichtigsten Commands

6Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

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

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.

7Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

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>

9Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

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.

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>

10Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

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.

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>

11Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

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.

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>

</Style>

</Image.Style>

</Image>

</Button>

12Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Icons in der ToolBar sollen anzeigen, ob der Button im Moment aktiv oder inaktiv gesetzt ist. Diese geschieht durch obige Anweisung.

Gewisse Buttons inaktiv Alle Buttons aktiv

Implementieren von eigenen Commands

13Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Nicht vordefinierter Command: Help

private void Help_Ausfuehren(object sender, ExecutedRoutedEventArgs e)

{

MessageBox.Show("Hilfe!!!");

}

private void Help_Aktiv(object sender, CanExecuteRoutedEventArgs e)

{

e.CanExecute = true;

}

14Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

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:

<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">

<Window.CommandBindings>

<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>

<MenuItem Header="Hilfe">

<MenuItem Command="Help"/>

</MenuItem>

</Menu>

Command in MainWindow.xaml vorbereiten

15Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Da Help kein bereits existierender Befehl ist, muss das CommandBinding in xamlzuerst definiert werden. Hier werden die beiden vorbereiteten Methoden registriert.

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!!!");

}

Help Command benutzen

16Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Nicht vordefinierter Command: Save

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;

}

17Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Für Befehle wie Save oder Open kann analog vorgegangen werden. Im File MainWindow.xaml.cs werden die Methoden Save_Ausfuehren und Save_Aktivimplementiert.

<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">

<Window.CommandBindings>

<CommandBinding Command="Save" CanExecute="Save_Aktiv"

Executed="Save_Ausfuehren" />

<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>

Save Command in MainWindow.xaml vorbereiten

18Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Das CommandBinding für den Save Befehl.Die Methoden Save_Ausfuehrenund Save_Aktiv werden für den Command registriert.

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;

}

Save Command Implementieren

19Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Der Name des Files.

Die Daten Klasse MeinText, welche als DataContext benutztwerden soll.

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");

}

Save Command implementieren

20Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

public class MeinText

{

private String fileName;

public MeinText(String fn)

{

this.fileName = fn;

}

private String input;

public String TextInput

{

get { return input; }

set {input = value; }

}

public void SaveToFile()

{

File.WriteAllText(fileName, input);

}

}

Die Klasse MeinText (DataContext)

21Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Der Name des Files.

Der Konstruktor speichert den File Namen

Die Eigensschaft TextInput speichert den Text der TextBox.

Die Methode SaveToFilespeichert den Text der TextBox in das File.

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 (zwischen-gespeichert) 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"/>

Save Command benutzen

22Nach dem Handbuch der .NET 4.0-Programmierung, Rolf Wenger, 2012

Die Event-Methode für das TextChangedEvent (in MainWindow.xaml.cs)

Die Event-Methode wirddann als Event-Handler an die TextBox registriert(in MainWindow.xaml).