Поделиться через


Практическое руководство. Подключение команды к элементу управления с поддержкой команды

В следующем примере показано, как подключить RoutedCommand к объекту Control со встроенной поддержкой команд. Полный пример, в котором команды присоединяются к нескольким источникам, см. в разделе Пример создания пользовательской команды RoutedCommand.

Пример

Windows Presentation Foundation (WPF) предоставляет библиотеку общих команд, которые регулярно используются при программировании приложений. Классы, составляющие библиотеку команд: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommands и EditingCommands.

Статические объекты RoutedCommand, составляющие эти классы, не предоставляют логику команд. Логика команды сопоставляется команде с помощью CommandBinding. Отдельные элементы управления обладают встроенной поддержкой CommandBinding для некоторых команд. Данный механизм позволяет сохранять семантику команды при изменении фактической реализации. Например, элемент управления TextBox обрабатывает команду Paste иначе, чем элемент управления, предназначенный для поддержки изображений, но основная идея вставки чего-либо остается прежней. Логика команды не может быть предоставлена командой. Логика команды обеспечивается элементом управления или приложением.

Во многих элементах управления в WPF есть встроенная поддержка некоторых команд из библиотеки команд. Например, элемент управления TextBox поддерживает многие команды редактирования приложения, такие как Paste, Copy, Cut, Redo и Undo. Разработчику приложения не нужно предпринимать специальных действий для обеспечения совместимости этих команд с этими элементами управления. Если при выполнении команды элемент TextBox является целью команды, он будет обрабатывать команду с помощью привязки CommandBinding, встроенной в элемент управления.

Ниже показано использование элемента управления MenuItem в качестве источника команды для команды Paste, где элемент управления TextBox является целью команды. Вся логика, определяющая, каким образом TextBox выполняет вставку, встроена в сам элемент управления TextBox.

Создается элемент управления MenuItem и его свойство Command задает значение команды Paste. Свойству CommandTarget неявно присвоено значение объекта TextBox. Если значение свойства CommandTarget не задано, целью команды является элемент, на котором установлен фокус клавиатуры. Если элемент, на котором установлен фокус клавиатуры, не поддерживает команду Paste или не может в данный момент выполнить команду вставки (например, буфер обмена пуст), тогда MenuItem будет неактивен (отображаться в сером цвете).

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

См. также

Задачи

Практическое руководство. Подключение команды к элементу управления, не поддерживающему команды

Основные понятия

Общие сведения о системе команд