Compartir vía


Cómo: Enlazar un comando a un control con la compatibilidad de comandos

En el ejemplo siguiente se muestra cómo enlazar un RoutedCommand a un Control que tiene compatibilidad integrada para el comando. Para obtener un ejemplo completo que enlace comandos a varios orígenes, consulte el ejemplo Crear un objeto RoutedCommand personalizado.

Ejemplo

Windows Presentation Foundation (WPF) proporciona una biblioteca de comandos comunes que los programadores de aplicaciones usan con regularidad. Las clases que constituyen la biblioteca de comandos son: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands y EditingCommands.

Los objetos RoutedCommand estáticos que componen estas clases no proporcionan la lógica del comando. La lógica del comando está asociada al comando con un objeto CommandBinding. Algunos controles tienen integrados objetos CommandBindings para algunos comandos. Este mecanismo permite que la semántica de un comando se mantenga, mientras que la implementación real puede cambiar. Un TextBox, por ejemplo, controla el comando Paste de manera diferente a un control diseñado para admitir imágenes, pero la idea básica del significado de pegar algo permanece intacta. La lógica de comando no puede proporcionarla el comando, sino que en su lugar debe proporcionarla el control o la aplicación.

Muchos controles de WPF tienen compatibilidad integrada para algunos de los comandos de la biblioteca de comandos. TextBox, por ejemplo, admite muchos de los comandos de edición de la aplicación, como Paste, Copy, Cut, Redo y Undo. El desarrollador de aplicaciones no tiene que hacer nada especial para que estos comandos funcionen con estos controles. Si TextBox es el destino del comando cuando se ejecuta el comando, controlará el comando mediante el CommandBinding que está integrado en el control.

A continuación se muestra cómo usar un MenuItem como el origen del comando para el comando Paste, donde un TextBox es el destino del comando. Toda la lógica que define cómo realiza TextBox la operación de pegado está integrada en el control TextBox.

Se crea un MenuItem y su propiedad Command se establece en el comando Paste. CommandTarget no se establece de forma explícita en el objeto TextBox. Cuando no se establece CommandTarget, el destino para el comando es el elemento que tiene el foco de teclado. Si el elemento que tiene el foco de teclado no admite el comando Paste o no puede ejecutar actualmente el comando Pegar (por ejemplo, porque el Portapapeles está vacío), MenuItem estará atenuado.

<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

Vea también