Есть динамически составляемое меню WPF
Каждому MenuItem генерируется и классическим образом навешивается RoutedUICommand команда, в которой все как надо, и подпись, и обработчики, и сочетание клавиш (KeyGesture).
Это все работает, в меню корректно отображаются и подписи и шорткаты. Но не работают эти самые шорктаты в окне, никак. Если на пункт меню повесить любую стандартную команду, например, "Cut", и сделать эту привязку в XAML формы — то все работает. А вручную, созданное динамически — нет.
Может кто с таким чудом сталкивался?
Спасибо.
Re: [WPF] Не работают шорктаты в самодельных RoutedUICommand
Здравствуйте, belnetmon, Вы писали:
B>Есть динамически составляемое меню WPF B>Каждому MenuItem генерируется и классическим образом навешивается RoutedUICommand команда, в которой все как надо, и подпись, и обработчики, и сочетание клавиш (KeyGesture). B>Это все работает, в меню корректно отображаются и подписи и шорткаты. Но не работают эти самые шорктаты в окне, никак. Если на пункт меню повесить любую стандартную команду, например, "Cut", и сделать эту привязку в XAML формы — то все работает. А вручную, созданное динамически — нет. B>Может кто с таким чудом сталкивался? B>Спасибо.
Код в студию
Re[2]: [WPF] Не работают шорктаты в самодельных RoutedUIComm
Может, конечно, и наглючено чего. С WPFом только месяц разбираюсь, так что сильно не бейте.
//здесь динамически создается очередной пункт меню
item = new MenuItem();
//порождаем под него команду
RoutedUICommand ruc = GenerateRoutedUICommand("MenuItem1", "Caption", "Ctrl+R");
//создаем биндинг команды, навешивая на нее внешние какие-то специфичные обработчики либо
BindUICommand(ruc, MenuHandle_execute, MenuHandle_AlwaysCan);
//подключаем команду к пункту меню
item.Command=ruc;
//метод создаетк и возвращает команду с заданными текстом и шорткатомpublic static RoutedUICommand GenerateRoutedUICommand(string name, string text, string shortcut) {
InputGestureCollection igc = new InputGestureCollection();
KeyGesture kg = null;
//создаем шорткат из текста
KeyGestureConverter kgk = new KeyGestureConverter();
try {
kg=(KeyGesture)kgk.ConvertFromString(shortcut);
} catch {
}
//если задан, то задаем шорткат в коллекцию шорткатов if (kg!=null)
igc.Add(kg);
//если будущая комнада с шорткатами или без, то разные конструкторыif (igc.Count==0)
return new RoutedUICommand(text, name, mOwner.GetType());
else
return new RoutedUICommand(text, name, mOwner.GetType(), igc);
}
//метод делает привязку новой команды к обработчикамvoid BindUICommand(RoutedUICommand ruc, ExecutedRoutedEventHandler exec_handle, CanExecuteRoutedEventHandler can_handle) {
CommandBinding binding = new CommandBinding(ruc);
if (exec_handle!=null)
binding.Executed+=exec_handle;
if (can_handle!=null)
binding.CanExecute+=can_handle;
mOwner.CommandBindings.Add(binding);
}
Re[3]: [WPF] Не работают шорктаты в самодельных RoutedUIComm
Здравствуйте, belnetmon, Вы писали:
B>>Код в студию
B>Может, конечно, и наглючено чего. С WPFом только месяц разбираюсь, так что сильно не бейте.
B>
B>//здесь динамически создается очередной пункт меню
B>item = new MenuItem();
B>//порождаем под него команду
B>RoutedUICommand ruc = GenerateRoutedUICommand("MenuItem1", "Caption", "Ctrl+R");
B>//создаем биндинг команды, навешивая на нее внешние какие-то специфичные обработчики либо
B>BindUICommand(ruc, MenuHandle_execute, MenuHandle_AlwaysCan);
B>//подключаем команду к пункту меню
B>item.Command=ruc;
B>//метод создаетк и возвращает команду с заданными текстом и шорткатом
B>public static RoutedUICommand GenerateRoutedUICommand(string name, string text, string shortcut) {
B> InputGestureCollection igc = new InputGestureCollection();
B> KeyGesture kg = null;
B> //создаем шорткат из текста
B> KeyGestureConverter kgk = new KeyGestureConverter();
B> try {
B> kg=(KeyGesture)kgk.ConvertFromString(shortcut);
B> } catch {
B> }
B> //если задан, то задаем шорткат в коллекцию шорткатов
B> if (kg!=null)
B> igc.Add(kg);
B> //если будущая комнада с шорткатами или без, то разные конструкторы
B> if (igc.Count==0)
B> return new RoutedUICommand(text, name, mOwner.GetType());
B> else
B> return new RoutedUICommand(text, name, mOwner.GetType(), igc);
B>}
B>//метод делает привязку новой команды к обработчикам
B>void BindUICommand(RoutedUICommand ruc, ExecutedRoutedEventHandler exec_handle, CanExecuteRoutedEventHandler can_handle) {
B> CommandBinding binding = new CommandBinding(ruc);
B> if (exec_handle!=null)
B> binding.Executed+=exec_handle;
B> if (can_handle!=null)
B> binding.CanExecute+=can_handle;
B> mOwner.CommandBindings.Add(binding);
B>}
B>
Мда. Зря я код попросил, видимо.Вы как бы в команд биндинги команду добавили, а вот шорткаты на команду для контрола в инпут биндинги — нет. По коду могу сказать только то, что из него ничего непонятно, кроме того, что я описал выше. Подобного рода задачи решаются стандартными средствами WPF:
CommandBindings.Add(new CommandBinding(CommonDialog.OkCommand, ExecuteOkCommand));///Тут добавляем комманд биндинг на команду
InputBindings.Add(new KeyBinding(CommonDialog.OkCommand, Key.Enter, ModifierKeys.None));//Тут добавляем еще и шорткат команде
Все это вызывается для того контрола, к которому хотим обработчики команд привязать.
А в целом по коду — советую перечитать Commanding in WPF
Re[4]: [WPF] Не работают шорктаты в самодельных RoutedUIComm
От:
Аноним
Дата:
26.02.10 10:39
Оценка:
Здравствуйте, Codechanger, Вы писали:
C> А в целом по коду — советую перечитать Commanding in WPF
Перечитал, спасибо. Ошибка нашлась: привязку CommandBindings необходимо делать к окну, а уменя была ошибка в этом.