Freigeben über


Gewusst wie: Einbinden eines Befehls in ein Steuerelement mit Befehlsunterstützung

Im folgenden Beispiel wird veranschaulicht, wie Sie ein RoutedCommand-Objekt an ein Control-Objekt binden, in das Unterstützung für den Befehl integriert ist. Ein vollständiges Beispiel, das Befehle mit mehrere Quellen verknüpft, finden Sie im Beispiel unter Create a Custom RoutedCommand Sample (Erstellen eines benutzerdefinierten „RoutedCommand“-Beispiels).

Beispiel

Windows Presentation Foundation (WPF) stellt eine Bibliothek mit gängigen Befehlen bereit, die Anwendungsprogrammierer häufig nutzen. Die Befehlsbibliothek besteht aus den folgenden Klassen: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands und EditingCommands.

Die statischen RoutedCommand-Objekte, aus denen diese Klassen bestehen, bieten keine Befehlslogik. Die Logik für den Befehl wird mit dem Befehl mit einem CommandBinding in Verbindung gebracht. Einige Steuerelemente verfügen über integrierte CommandBindings für einige Befehle. Dieser Mechanismus ermöglicht es, dass die Semantik eines Befehls unverändert bleibt, während sich die eigentliche Implementierung ändern kann. Eine TextBox verarbeitet z.B. den Paste-Befehl anders als ein Steuerelement, das entworfen wurde, um Images zu unterstützen. Die grundlegende Idee, was es bedeutet, etwas einzufügen, ist jedoch die gleiche. Die Befehlslogik kann nicht vom Befehl bereitgestellt werden, muss jedoch vom Steuerelement oder der Anwendung bereitgestellt werden.

Viele Steuerelemente in WPF verfügen über eine integrierte Unterstützung für einige Befehle der Befehlsbibliothek. TextBox unterstützt z.B. viele Befehle zum Bearbeiten von Anwendungen (z.B. Paste, Copy, Cut, Redo und Undo). Der Anwendungsentwickler muss gar nichts Besonderes tun, um diese Befehle zum Arbeiten mit diesen Steuerelementen zu erhalten. Wenn das TextBox-Objekt bei Ausführung des Befehls das Ziel ist, wird der Befehl mit dem CommandBinding-Objekt behandelt, das in das Steuerelement integriert ist.

Im folgenden Codeausschnitt wird veranschaulicht, wie Sie ein MenuItem-Objekt als Befehlsquelle für den Paste-Befehl verwenden können, wobei TextBox das Ziel des Befehls ist. Die gesamte Logik, die definiert, wie TextBox den Einfügungsvorgang durchführt, ist im Steuerelement TextBox integriert.

Eine MenuItem-Klasse wird generiert, und deren Command-Eigenschaft wird auf den BefehlPaste festgelegt. Die CommandTarget-Eigenschaft wird nicht explizit auf das Objekt TextBox festgelegt. Wenn das CommandTarget nicht festgelegt wird, ist das Ziel für den Befehl das Element, das den Tastaturfokus besitzt. Wenn das Element, das den Tastaturfokus besitzt, den Befehl Paste nicht unterstützt oder derzeit den Einfügungsbefehl nicht ausführen kann (die Zwischenablage ist beispielsweise leer), ist das MenuItem ausgegraut.

<Window x:Class="SDKSamples.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MenuItemCommandTask"
    >
    <DockPanel>
      <Menu DockPanel.Dock="Top">
        <MenuItem Command="ApplicationCommands.Paste" Width="75" />
      </Menu>
      <TextBox BorderBrush="Black" BorderThickness="2" Margin="25"
               TextWrapping="Wrap">
        The MenuItem will not be enabled until
        this TextBox gets keyboard focus  
      </TextBox>
    </DockPanel>
</Window>
// Window1 constructor
public Window1()
{
    InitializeComponent();

    // Instantiating UIElements.
    DockPanel mainPanel = new DockPanel();
    Menu mainMenu = new Menu();
    MenuItem pasteMenuItem = new MenuItem();
    TextBox mainTextBox = new TextBox();

    // Associating the MenuItem with the Paste command.
    pasteMenuItem.Command = ApplicationCommands.Paste;

    // Setting properties on the TextBox.
    mainTextBox.Text =
        "The MenuItem will not be enabled until this TextBox receives keyboard focus.";
    mainTextBox.Margin = new Thickness(25);
    mainTextBox.BorderBrush = Brushes.Black;
    mainTextBox.BorderThickness = new Thickness(2);
    mainTextBox.TextWrapping = TextWrapping.Wrap;

    // Attaching UIElements to the Window.
    this.AddChild(mainPanel);
    mainMenu.Items.Add(pasteMenuItem);
    mainPanel.Children.Add(mainMenu);
    mainPanel.Children.Add(mainTextBox);

    // Defining DockPanel layout.
    DockPanel.SetDock(mainMenu, Dock.Top);
    DockPanel.SetDock(mainTextBox, Dock.Bottom);
}
' Window1 constructor
Public Sub New()
    InitializeComponent()

    ' Instantiating UIElements.
    Dim mainPanel As New DockPanel()
    Dim mainMenu As New Menu()
    Dim pasteMenuItem As New MenuItem()
    Dim mainTextBox As New TextBox()

    ' Associating the MenuItem with the Paste command.
    pasteMenuItem.Command = ApplicationCommands.Paste

    ' Setting properties on the TextBox.
    mainTextBox.Text = "The MenuItem will not be enabled until this TextBox receives keyboard focus."
    mainTextBox.Margin = New Thickness(25)
    mainTextBox.BorderBrush = Brushes.Black
    mainTextBox.BorderThickness = New Thickness(2)
    mainTextBox.TextWrapping = TextWrapping.Wrap

    ' Attaching UIElements to the Window.
    Me.AddChild(mainPanel)
    mainMenu.Items.Add(pasteMenuItem)
    mainPanel.Children.Add(mainMenu)
    mainPanel.Children.Add(mainTextBox)

    ' Defining DockPanel layout.
    DockPanel.SetDock(mainMenu, Dock.Top)
    DockPanel.SetDock(mainTextBox, Dock.Bottom)
End Sub

Weitere Informationen