Как привязать команду к элементу управления без поддержки командного интерфейса
В следующем примере показано, как подключить RoutedCommand к Control, которая не имеет встроенной поддержки для команды. Полный пример, в котором выполняется подключение команд к нескольким источникам, см. пример Создание пользовательской команды маршрутизации RoutedCommand.
Пример
Windows Presentation Foundation (WPF) предоставляет библиотеку распространенных команд, с которыми регулярно сталкиваются программисты приложений. Классы, составляющие библиотеку команд: ApplicationCommands, ComponentCommands, NavigationCommands, MediaCommandsи EditingCommands.
Статические RoutedCommand объекты, составляющие эти классы, не предоставляют логику команд. Логика команды относится к команде с CommandBinding. Многие элементы управления в WPF имеют встроенную поддержку для некоторых команд в библиотеке команд. TextBox, например, поддерживает многие команды редактирования приложения, такие как Paste, Copy, Cut, Redoи Undo. Разработчик приложений не должен делать ничего специального, чтобы получить эти команды для работы с этими элементами управления. Если TextBox является целевым объектом команды при её выполнении, она будет обрабатывать команду с помощью CommandBinding, встроенного в элемент управления.
Ниже показано, как использовать Button в качестве источника команд для команды Open. Создается CommandBinding, который связывает указанные CanExecuteRoutedEventHandler и CanExecuteRoutedEventHandler с RoutedCommand.
Сначала создается источник команды. В качестве источника команд используется Button.
<Button Command="ApplicationCommands.Open" Name="MyButton"
Height="50" Width="200">
Open (KeyBindings: Ctrl+R, Ctrl+0)
</Button>
// Button used to invoke the command
Button CommandButton = new Button();
CommandButton.Command = ApplicationCommands.Open;
CommandButton.Content = "Open (KeyBindings: Ctrl-R, Ctrl-0)";
MainStackPanel.Children.Add(CommandButton);
' Button used to invoke the command
Dim CommandButton As New Button()
CommandButton.Command = ApplicationCommands.Open
CommandButton.Content = "Open (KeyBindings: Ctrl-R, Ctrl-0)"
MainStackPanel.Children.Add(CommandButton)
Затем создаются ExecutedRoutedEventHandler и CanExecuteRoutedEventHandler.
ExecutedRoutedEventHandler просто открывает MessageBox, чтобы обозначить, что команда была выполнена.
CanExecuteRoutedEventHandler задает для свойства CanExecute значение true
. Как правило, обработчик может выполнять более надежные проверки, чтобы узнать, может ли команда выполняться в текущем целевом объекте команды.
void OpenCmdExecuted(object target, ExecutedRoutedEventArgs e)
{
String command, targetobj;
command = ((RoutedCommand)e.Command).Name;
targetobj = ((FrameworkElement)target).Name;
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj);
}
void OpenCmdCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
Private Sub OpenCmdExecuted(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
Dim command, targetobj As String
command = CType(e.Command, RoutedCommand).Name
targetobj = CType(sender, FrameworkElement).Name
MessageBox.Show("The " + command + " command has been invoked on target object " + targetobj)
End Sub
Private Sub OpenCmdCanExecute(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
e.CanExecute = True
End Sub
Наконец, CommandBinding создается в корне Window приложения, который ассоциирует обработчики маршрутизируемых событий с командой Open.
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Open"
Executed="OpenCmdExecuted"
CanExecute="OpenCmdCanExecute"/>
</Window.CommandBindings>
// Creating CommandBinding and attaching an Executed and CanExecute handler
CommandBinding OpenCmdBinding = new CommandBinding(
ApplicationCommands.Open,
OpenCmdExecuted,
OpenCmdCanExecute);
this.CommandBindings.Add(OpenCmdBinding);
' Creating CommandBinding and attaching an Executed and CanExecute handler
Dim OpenCmdBinding As New CommandBinding(ApplicationCommands.Open, AddressOf OpenCmdExecuted, AddressOf OpenCmdCanExecute)
Me.CommandBindings.Add(OpenCmdBinding)
См. также
- Командующий обзор
- Подключить команду к органу управления с поддержкой команд
.NET Desktop feedback