Как подключить команду к элементу управления, поддерживающему команды
В следующем примере показано, как подключить RoutedCommand к Control, имеющему встроенную поддержку команды. Полный пример, в котором выполняется подключение команд к нескольким источникам, см. в примере Создание примера пользовательского маршрута RoutedCommand.
Пример
Windows Presentation Foundation (WPF) предоставляет библиотеку распространенных команд, с которыми регулярно сталкиваются программисты приложений. Классы, составляющие библиотеку команд: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsи EditingCommands.
Статические RoutedCommand объекты, составляющие эти классы, не предоставляют логику команд. Логика команды связана с другой командой под номером CommandBinding. Некоторые элементы управления встроены в CommandBindings для некоторых команд. Этот механизм позволяет семантике команды оставаться одинаковой, в то время как фактическая реализация может измениться. Например, 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="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
См. также
.NET Desktop feedback