Partager via


Guide pratique pour raccorder une commande à un contrôle avec prise en charge de commande

L’exemple suivant montre comment raccorder RoutedCommand à un Control qui a une prise en charge intégrée de la commande. Pour obtenir un exemple complet qui raccorde des commandes à plusieurs sources, consultez l’exemple Créer un exemple RoutedCommand personnalisé.

Exemple

Windows Presentation Foundation (WPF) fournit une bibliothèque de commandes courantes que les programmeurs d’applications rencontrent régulièrement. Les classes qui constituent la bibliothèque de commandes sont : ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands et EditingCommands.

Les objets statiques RoutedCommand qui composent ces classes ne fournissent pas de logique de commande. La logique de la commande est associée à la commande avec CommandBinding. Certains contrôles ont un CommandBindings intégré pour certaines commandes. Ce mécanisme permet à la sémantique d’une commande de rester la même, tandis que l’implémentation réelle peut changer. TextBox, par exemple, gère la commande Paste différemment d’un contrôle conçu pour prendre en charge les images. Toutefois, le principe de base relatif au collage reste le même. La logique de commande ne peut pas être fournie par la commande. Elle doit plutôt être fournie par le contrôle ou l’application.

De nombreux contrôles dans WPF prennent en charge certaines des commandes de la bibliothèque de commandes. TextBox, par exemple, prend en charge de nombreuses commandes d’édition de l’application, par exemple Paste, Copy, Cut, Redo et Undo. Le développeur d’application n’a aucune action spéciale à effectuer pour que ces commandes fonctionnent avec ces contrôles. Si TextBox est la cible de commande au moment de l’exécution de la commande, il gère la commande à l’aide de CommandBinding, qui est intégré au contrôle.

L’exemple suivant montre comment utiliser MenuItem en tant que source de commande pour la commande Paste, où TextBox est la cible de la commande. Toute la logique qui définit la façon dont TextBox effectue le collage est intégrée dans le contrôle TextBox.

MenuItem est créé, et sa propriété Command a la valeur de la commande Paste. CommandTarget n’est pas explicitement défini en fonction de l’objet TextBox. Lorsque le CommandTarget paramètre n’est pas défini, la cible de la commande est l’élément qui a le focus clavier. Si l’élément qui a le focus clavier ne prend pas en charge la commande Paste ou ne peut pas exécuter la commande de collage (le Presse-papiers est vide, par exemple), MenuItem est grisé.

<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

Voir aussi