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


Практическое руководство. Включение команды

Обновлен: Ноябрь 2007

В следующем примере демонстрируется использование команд в Windows Presentation Foundation (WPF). В примере показано, как связать команду RoutedCommand с элементом Button, создать привязку CommandBinding и обработчики событий, в которых реализована RoutedCommand. Дополнительные сведения о работе с командами см. в разделе Общие сведения о системе команд.

Пример

В первой части кода создается пользовательский интерфейс, состоящий из кнопки 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.
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 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;
    }
}

См. также

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

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