Freigeben über


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

Das folgende Beispiel zeigt, wie Sie einen RoutedCommand in ein Control einbinden, das über eine integrierte Unterstützung für den Befehl verfügt. Ein vollständiges Beispiel, in dem Befehle in mehrere Quellen eingebunden werden, finden Sie unter Beispiel für das Erstellen eines benutzerdefinierten "RoutedCommand".

Beispiel

Windows Presentation Foundation (WPF) stellt eine Bibliothek mit allgemeinen Befehlen bereit, die Anwendungsprogrammierer häufig nutzen. Die Befehlsbibliothek enthält die folgenden Klassen: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands und EditingCommands.

Die statischen RoutedCommand-Objekte, aus denen diese Klassen bestehen, stellen keine Befehlslogik bereit. Die Logik für den Befehl wird dem Befehl mithilfe von CommandBinding bereitgestellt. Einige Steuerelemente verfügen über integrierte CommandBindings für bestimmte Befehle. Mithilfe dieses Mechanismus kann die Semantik eines Befehls unverändert bleiben, während sich die eigentliche Implementierung ändern kann. Ein TextBox behandelt den Paste-Befehl zum Beispiel anders als ein Steuerelement, das zum Unterstützen von Bildern entworfen wurde, aber die grundlegende Bedeutung des Einfügens von Elementen bleibt gleich. Die Befehlslogik kann nicht vom Befehl bereitgestellt werden, sondern muss vom Steuerelement oder von der Anwendung bereitgestellt werden.

Viele Steuerelemente in WPF verfügen über eine integrierte Unterstützung für einige Befehle der Befehlsbibliothek. TextBox unterstützt zum Beispiel viele Bearbeitungsbefehle der Anwendung, wie Paste, Copy, Cut, Redo und Undo. Anwendungsentwickler müssen keine speziellen Schritte ausführen, damit diese Befehle mit diesen Steuerelementen funktionieren. Wenn das TextBox das Befehlsziel ist, wenn der Befehl ausgeführt wird, behandelt es den Befehl mithilfe des CommandBinding-Elements, das in das Steuerelement integriert ist.

Im Folgenden wird gezeigt, wie Sie ein MenuItem als Befehlsquelle für den Paste-Befehl verwenden, wobei ein TextBox das Ziel des Befehls darstellt. Die gesamte Logik, die definiert, wie das TextBox das Einfügen durchführt, ist in das TextBox-Steuerelement integriert.

Es wird ein MenuItem erstellt, und seine Command-Eigenschaft wird auf den Paste-Befehl gesetzt. Das CommandTarget ist nicht explizit auf das TextBox-Objekt festgelegt. Wenn das CommandTarget nicht festgelegt ist, ist das Ziel für den Befehl das Element, das den Tastaturfokus besitzt. Wenn das Element, das den Tastaturfokus besitzt, den Paste-Befehl nicht unterstützt oder den Einfügebefehl momentan nicht ausführen kann (zum Beispiel wenn die Zwischenablage leer ist), ist das MenuItem abgeblendet.

<Window x:Class="SDKSamples.Window1"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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 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
// 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);
}

Siehe auch

Aufgaben

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

Konzepte

Befehlsübersicht