Delen via


Hoe: Een commando koppelen aan een UI-element met commando-ondersteuning

In het volgende voorbeeld ziet u hoe u een RoutedCommand koppelt aan een Control die ingebouwde ondersteuning voor de opdracht heeft. Zie het Een voorbeeld van een aangepaste RoutedCommand maken voor een compleet voorbeeld dat opdrachten koppelt aan meerdere bronnen.

Voorbeeld

Windows Presentation Foundation (WPF) biedt een bibliotheek met algemene opdrachten die programmeurs van toepassingen regelmatig tegenkomen. De klassen die bestaan uit de opdrachtbibliotheek zijn: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsen EditingCommands.

De statische RoutedCommand objecten waaruit deze klassen bestaan, leveren geen opdrachtlogica op. De logica voor de opdracht is gekoppeld aan de opdracht met een CommandBinding. Sommige besturingselementen hebben ingebouwde CommandBindings voor bepaalde opdrachten. Met dit mechanisme kunnen de semantiek van een opdracht hetzelfde blijven, terwijl de daadwerkelijke implementatie kan worden gewijzigd. Een TextBoxverwerkt bijvoorbeeld de Paste opdracht anders dan een besturingselement dat is ontworpen ter ondersteuning van afbeeldingen, maar het basisidee van wat het betekent om iets te plakken blijft hetzelfde. De opdrachtlogica kan niet worden opgegeven door de opdracht, maar moet worden geleverd door het besturingselement of de toepassing.

Veel besturingselementen in WPF hebben ingebouwde ondersteuning voor sommige van de opdrachten in de opdrachtbibliotheek. TextBoxondersteunt bijvoorbeeld veel opdrachten voor het bewerken van toepassingen, zoals Paste, Copy, Cut, Redoen Undo. De toepassingsontwikkelaar hoeft niets speciaals te doen om deze opdrachten te laten werken met deze besturingselementen. Als het TextBox het opdrachtdoel is wanneer de opdracht wordt uitgevoerd, wordt de opdracht afgehandeld met behulp van de CommandBinding die is ingebouwd in het besturingselement.

Hieronder ziet u hoe u een MenuItem gebruikt als de opdrachtbron voor de opdracht Paste, waarbij een TextBox het doel van de opdracht is. Alle logica die definieert hoe de TextBox de plakbewerking uitvoert, is ingebouwd in het besturingselement TextBox.

Een MenuItem wordt gemaakt en de eigenschap Command wordt ingesteld op de opdracht Paste. De CommandTarget is niet expliciet ingesteld op het TextBox-object. Wanneer de CommandTarget niet is ingesteld, is het doel voor de opdracht het element dat de toetsenbordfocus heeft. Als het element met toetsenbordfocus de opdracht Paste niet ondersteunt of de plakopdracht momenteel niet kan uitvoeren (het klembord is bijvoorbeeld leeg), wordt de MenuItem grijs weergegeven.

<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

Zie ook