Sdílet prostřednictvím


Postupy: Připojení příkazu k ovládacímu prvku pomocí podpory příkazů

Následující příklad ukazuje, jak připojit RoutedCommand k Control, který má integrovanou podporu příkazu. Kompletní ukázku, která připojuje příkazy k více zdrojům, naleznete v ukázce Vytvoření vlastní příkazové cesty RoutedCommand.

Příklad

Windows Presentation Foundation (WPF) poskytuje knihovnu běžných příkazů, se kterými se programátoři aplikací setkávají pravidelně. Třídy, které tvoří knihovnu příkazů, jsou: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsa EditingCommands.

Objekty RoutedCommand, které tvoří tyto statické třídy, neposkytují logiku příkazů. Logika příkazu je asociována s příkazem s CommandBinding. Některé ovládací prvky mají vestavěné CommandBindings pro některé příkazy. Tento mechanismus umožňuje sémantiku příkazu zůstat stejná, zatímco skutečná implementace se může změnit. TextBoxnapříklad zpracovává příkaz Paste jinak než ovládací prvek navržený pro podporu obrázků, ale základní myšlenka, co znamená vložit něco, zůstane stejné. Logiku příkazu nelze zadat, ale musí ji zadat ovládací prvek nebo aplikace.

Mnoho ovládacích prvků ve WPF má integrovanou podporu některých příkazů v knihovně příkazů. TextBox, například podporuje mnoho příkazů pro úpravy aplikace, jako jsou Paste, Copy, Cut, Redoa Undo. Vývojář aplikací nemusí dělat nic zvláštního, aby tyto příkazy fungovaly s těmito ovládacími prvky. Pokud je TextBox cílem příkazu při spuštění příkazu, zpracuje příkaz pomocí CommandBinding, který je součástí ovládacího prvku.

Následující příklad ukazuje, jak použít MenuItem jako zdroj příkazů pro příkaz Paste, kde TextBox je cílem příkazu. Veškerá logika, která definuje, jak TextBox provádí vložení, je integrovaná do ovládacího prvku TextBox.

Vytvoří se MenuItem a vlastnost Command je nastavená na příkaz Paste. CommandTarget není explicitně nastaven na objekt TextBox. Pokud CommandTarget není nastaven, cílem příkazu je prvek, který má fokus klávesnice. Pokud prvek, který má klávesnici ve fokusu, nepodporuje příkaz Paste nebo nemůže aktuálně spustit příkaz pro vložení (například pokud je schránka prázdná), pak bude MenuItem šedé.

<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

Viz také