Практическое руководство. Включение команды
В следующем примере демонстрируется использование команд в Windows Presentation Foundation (WPF). В примере показано, как связать команду RoutedCommand с элементом Button, создать привязку CommandBinding и обработчики событий, в которых реализована RoutedCommand. Дополнительные сведения о работе с командами см. в разделе Общие сведения о системе команд.
Пример
В первой части кода создается user interface (UI), состоящий из кнопки Button и панели StackPanel, и создается привязка CommandBinding, связывающая обработчик команды с RoutedCommand.
Свойство Command элемента Button связано с командой Close.
Привязка CommandBinding добавляется в коллекцию CommandBindingCollection корневого окна Window. Обработчики событий Executed и CanExecute присоединены к этой привязке и связаны с командой Close.
При отсутствии привязки CommandBinding отсутствует логика команды, есть только механизм для вызова команды. При нажатии кнопки Button вызывается событие RoutedEvent PreviewExecuted для цели команды, за которым следует событие RoutedEvent Executed. Эти события проходят по дереву элементов в поисках привязки CommandBinding для этой конкретной команды. Стоит отметить, что поскольку событие RoutedEvent проходит дерево элементов и передается вверх по иерархии объектов, необходимо соблюдать осторожность при выборе места установки привязки CommandBinding. Если привязка CommandBinding относится к тому же уровню, что и цель команды или другой узел, который не расположен на маршруте события RoutedEvent, привязка CommandBinding не осуществляется.
<Window x:Class="WCSamples.Window1"
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
Title="CloseCommand"
Name="RootWindow"
>
<Window.CommandBindings>
<CommandBinding Command="ApplicationCommands.Close"
Executed="CloseCommandHandler"
CanExecute="CanExecuteHandler"
/>
</Window.CommandBindings>
<StackPanel Name="MainStackPanel">
<Button Command="ApplicationCommands.Close"
Content="Close File" />
</StackPanel>
</Window>
' Create ui elements.
Dim CloseCmdStackPanel As New StackPanel()
Dim CloseCmdButton As New Button()
CloseCmdStackPanel.Children.Add(CloseCmdButton)
' Set Button's properties.
CloseCmdButton.Content = "Close File"
CloseCmdButton.Command = ApplicationCommands.Close
' Create the CommandBinding.
Dim CloseCommandBinding As New CommandBinding(ApplicationCommands.Close, AddressOf CloseCommandHandler, AddressOf CanExecuteHandler)
' Add the CommandBinding to the root Window.
RootWindow.CommandBindings.Add(CloseCommandBinding)
// Create ui elements.
StackPanel CloseCmdStackPanel = new StackPanel();
Button CloseCmdButton = new Button();
CloseCmdStackPanel.Children.Add(CloseCmdButton);
// Set Button's properties.
CloseCmdButton.Content = "Close File";
CloseCmdButton.Command = ApplicationCommands.Close;
// Create the CommandBinding.
CommandBinding CloseCommandBinding = new CommandBinding(
ApplicationCommands.Close, CloseCommandHandler, CanExecuteHandler);
// Add the CommandBinding to the root Window.
RootWindow.CommandBindings.Add(CloseCommandBinding);
В следующей части кода реализуются обработчики событий Executed и CanExecute.
Обработчик Executed вызывает метод закрытия открытых файлов. Обработчик CanExecute вызывает метод для определения того, является ли файл открытым. Если файл открыт, для метода CanExecute устанавливается значение true; в противном случае ему присваивается значение false.
' Executed event handler.
Private Sub CloseCommandHandler(ByVal sender As Object, ByVal e As ExecutedRoutedEventArgs)
' Calls a method to close the file and release resources.
CloseFile()
End Sub
' CanExecute event handler.
Private Sub CanExecuteHandler(ByVal sender As Object, ByVal e As CanExecuteRoutedEventArgs)
' Call a method to determine if there is a file open.
' If there is a file open, then set CanExecute to true.
If IsFileOpened() Then
e.CanExecute = True
' if there is not a file open, then set CanExecute to false.
Else
e.CanExecute = False
End If
End Sub
// Executed event handler.
private void CloseCommandHandler(object sender, ExecutedRoutedEventArgs e)
{
// Calls a method to close the file and release resources.
CloseFile();
}
// CanExecute event handler.
private void CanExecuteHandler(object sender, CanExecuteRoutedEventArgs e)
{
// Call a method to determine if there is a file open.
// If there is a file open, then set CanExecute to true.
if (IsFileOpened())
{
e.CanExecute = true;
}
// if there is not a file open, then set CanExecute to false.
else
{
e.CanExecute = false;
}
}