Partager via


Comment : raccorder une commande à un contrôle avec prise en charge de commande

Mise à jour : novembre 2007

L'exemple suivant montre comment raccorder une RoutedCommand à un Control offrant une prise en charge intégrée de la commande. Pour un exemple complet de raccordement de commandes à plusieurs sources, consultez l'exemple Créer un RoutedCommand personnalisé, exemple.

Exemple

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

Les objets RoutedCommand statiques qui composent ces classes ne fournissent pas de logique de commande. La logique de commande est associée à la commande à l'aide d'une CommandBinding. Certains contrôles possèdent des liaisons de commande intégrées pour certaines commandes. Ce mécanisme permet à la sémantique d'une commande de rester la même, alors que l'implémentation réelle peut changer. Par exemple, un contrôle TextBox gèrera la commande Paste d'une manière autre qu'un contrôle conçu pour prendre en charge des images. L'idée de base, à savoir coller quelque chose, reste toutefois la même. La logique de commande ne peut pas être fournie par la commande, mais doit l'être par le contrôle ou l'application.

De nombreux contrôles dans WPF offrent une prise en charge intégrée pour certaines commandes de la bibliothèque de commandes. Par exemple, TextBox prend en charge de nombreuses commandes de modification de l'application, telles que Paste, Copy, Cut, Redo et Undo. Le développeur d'applications ne doit rien faire de spécial pour que ces commandes fonctionnent avec ces contrôles. Si le contrôle TextBox est la cible de la commande lors de l'exécution de celle-ci, il gérera la commande à l'aide de la CommandBinding qui lui est intégrée.

L'exemple suivant montre comment utiliser un MenuItem en tant que source de la commande Paste, dont le contrôle TextBox est la cible. Toute la logique qui définit la manière dont le contrôle TextBox effectue le collage est intégrée à celui-ci.

Un MenuItem est créé et sa propriété Command prend pour valeur la commande Paste. L'objet TextBox n'est pas explicitement affecté à la CommandTarget. Lorsque la CommandTarget n'est pas définie, la cible 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 pour l'instant (parce que le presse-papiers est vide, par exemple), alors MenuItem apparaît en grisé.

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

Voir aussi

Tâches

Comment : raccorder une commande à un contrôle sans prise en charge de commande

Concepts

Vue d'ensemble des commandes