Как вы определяете команду, вы определяете ее для определенного окна.Если вы хотите обрабатывать команду глобально, на уровне приложения вы можете использовать CommandManager.RegisterClassCommandBinding
:
Сначала определите вашу команду в отдельном статическом классе:
public static class GlobalCommands
{
public static RoutedUICommand AddCommand1 = new RoutedUICommand("Command ", "command1", typeof(MainWindow));
}
Затем вВ окне или в любом месте, куда вы хотите поместить логику команд, зарегистрируйте обработчики команд:
public partial class MainWindow : Window
{
static MainWindow()
{
CommandManager.RegisterClassCommandBinding(typeof(Window), new CommandBinding(GlobalCommands.AddCommand1, AddCommand1Executed, CanAddExecute));
}
private static void AddCommand1Executed(object sender, ExecutedRoutedEventArgs e)
{
AddNewItem picker = new AddNewItem();
picker.ShowDialog();
}
}
И в вашем стиле меню вы должны изменить привязку на x:Static
:
<Setter Property="Command" Value="{x:Static my:GlobalCommands.AddCommand1}" />
Когда команда маршрутизируется, при проверке привязок команд в каждом активном элементе в пользовательском интерфейсе также проверяются привязки, зарегистрированные для класса каждого элемента.Регистрируя здесь привязку, вы можете сделать так, чтобы каждый экземпляр класса мог обрабатывать определенную команду.
Итак, в приведенном выше примере используется тип Window
, и это приведет к маршрутизациинайдите привязку команды в любом экземпляре Window
, как только маршрутизация достигнет этого экземпляра в поиске привязки команды.
Вместо этого вы можете, например, ограничить обработку доопределенный подкласс Window
, так что команда будет связана только в экземпляре этого подкласса.Или вы можете использовать какой-либо другой тип элемента пользовательского интерфейса, чтобы присутствие этого определенного типа элемента вызывало обработку события.Просто установите тип владельца для зарегистрированной привязки команды в соответствии с вашими потребностями.