Использовать глобальные привязки команд в WPF и C#
Пример
Этот метод не работает, если вы хотите использовать глобальные привязки команд для управления элементами управления в нескольких окнах. Например, предположим, что ваше приложение должно выполнить некоторую глобальную задачу. В предыдущем примере показано, как использовать команды для управления этой задачей в одном окне, но это не сработает, если вы хотите разрешить управление несколькими окнами для участия. К счастью, это не так сложно изменить этот пример, чтобы он работал.
Прежде чем я покажу, как это сделать, позвольте мне немного объяснить этот пример. Когда он загружается, главное окно создает вторичное окно типа SecondaryWindow. Этот класс определяет следующее публичное поле.
public Window1 MainWindow;
В главном окне этот код используется для создания и отображения вторичного окна.
// Отображение вторичного окна. Secondary = new SecondaryWindow(); Secondary.MainWindow = this; ... Secondary.Show();
Этот код создает SecondaryWindow, устанавливает его поле MainWindow для ссылки на главное окно и отображает окно. (Я кратко опишу опущенные операторы.)
Главное окно определяет следующее публичное поле.
// Логическое значение, указывающее, разрешены ли изменения. public bool AllowChangeBackground = true;
Оба окна «Включить кнопки« Разрешить »переключают это значение. Например, кнопка «Разрешить включение вторичного окна» использует этот код.
private void ToggleAllow_Click(object sender, RoutedEventArgs e) { MainWindow.AllowChangeBackground = !MainWindow.AllowChangeBackground; }
Теперь позвольте мне рассказать о команде. Следующий код показывает полный обработчик события Loaded главного окна главного окна.
private void Window_Loaded(object sender, RoutedEventArgs e) { // Создаем жест Ctrl + B. InputGestureCollection change_bg_gestures = new InputGestureCollection(); change_bg_gestures.Add( new KeyGesture(Key.B, ModifierKeys.Control, "Ctrl+B")); // Создаем команду ChangeBackground. RoutedUICommand change_bg_command = new RoutedUICommand( "Change the application's background color.", "ChangeBackground", typeof(Window), change_bg_gestures); // Связывание команды ChangeBackground с обработчиками событий CommandBinding change_bg_binding = new CommandBinding(change_bg_command); change_bg_binding.CanExecute += change_bg_CanExecute; change_bg_binding.Executed += change_bg_Executed; this.CommandBindings.Add(change_bg_binding); // Установите свойства Command для элементов управления ChangeBackground. btnChangeBackground.Command = change_bg_command; // Отображение вторичного окна. Secondary = new SecondaryWindow(); Secondary.MainWindow = this; Secondary.btnChangeBackground.Command = change_bg_command; Secondary.CommandBindings.Add(change_bg_binding); Secondary.Show(); }
Этот код создает команду более или менее так же, как в предыдущем примере. Он создает коллекцию жестов, определяет жест Ctrl + B и использует коллекцию для создания RoutedUICommand.
Этот код создает команду более или менее так же, как в предыдущем примере. Он создает коллекцию жестов, определяет жест Ctrl + B и использует коллекцию для создания RoutedUICommand.
...
Далее идет новый материал. После создания вторичного окна код устанавливает это свойство btnChangeBackground этого окна в ту же команду. Строка, выделенная синим цветом, добавляет привязку к коллекции CommandBindings вторичного окна. Я опускаю этот шаг, вторичное окно не получает уведомления, когда обработчик события CanExecute команды запускается, поэтому он не может обновить свою кнопку фона.
Остальная часть примера похожа на предыдущую. Следующий код показывает обработчики событий CanExecute и Executed.
private void change_bg_CanExecute(object sender, CanExecuteRoutedEventArgs e) { if (!IsLoaded) return; e.CanExecute = AllowChangeBackground; } private Brush brush1 = Brushes.LightBlue; private Brush brush2 = Brushes.LightGreen; void change_bg_Executed(object sender, ExecutedRoutedEventArgs e) { Brush brush; if (Background == brush2) brush = brush1; else brush = brush2; Background = brush; Secondary.Background = brush; }
Эти обработчики событий довольно просты. В этом примере только две кнопки для команды ChangeBackground, но вы можете добавить к ней любое количество других кнопок, пунктов меню и других элементов управления.