Compartilhar via


Como conectar um comando a um controle com suporte de comando

O exemplo a seguir mostra como conectar um RoutedCommand a um Control que tem suporte interno para o comando. Para obter um exemplo completo que conecta comandos a várias fontes, consulte o exemplo Criar um Exemplo de RoutedCommand Personalizado.

Exemplo

O Windows Presentation Foundation (WPF) fornece uma biblioteca de comandos comuns que os programadores de aplicativos encontram regularmente. As classes que compõem a biblioteca de comandos são: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandse EditingCommands.

Os objetos RoutedCommand estáticos que compõem essas classes não fornecem lógica de comando. A lógica do comando está associada ao comando com um CommandBinding. Alguns controles têm CommandBindings embutidos para alguns comandos. Esse mecanismo permite que a semântica de um comando permaneça a mesma, enquanto a implementação real pode ser alterada. Um TextBox, por exemplo, manipula o comando Paste de forma diferente de um controle projetado para dar suporte a imagens, mas a ideia básica do que significa colar algo permanece a mesma. A lógica de comando não pode ser fornecida pelo comando, mas deve ser fornecida pelo controle ou pelo aplicativo.

Muitos controles no WPF têm suporte interno para alguns dos comandos na biblioteca de comandos. TextBox, por exemplo, dá suporte a muitos dos comandos de edição de aplicativo, como Paste, Copy, Cut, Redoe Undo. O desenvolvedor de aplicativos não precisa fazer nada especial para que esses comandos funcionem com esses controles. Se o TextBox for o destino de comando quando o comando for executado, ele manipulará o comando usando o CommandBinding integrado ao controle.

O exemplo a seguir mostra como usar um MenuItem como fonte de comando para o comando Paste, em que um TextBox é o destino do comando. Toda a lógica que define como o TextBox executa a colagem é incorporada ao controle TextBox.

Um MenuItem é criado e sua propriedade Command é definida como o comando Paste. O CommandTarget não está explicitamente definido como o objeto TextBox. Quando o CommandTarget não está definido, o destino para o comando é o elemento que tem o foco do teclado. Se o elemento que tem o foco do teclado não der suporte ao comando Paste ou não puder executar o comando de colagem no momento (por exemplo, se a área de transferência estiver vazia), o MenuItem ficará acinzentado.

<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

Consulte também