Как лучше всего справиться с одним и тем же ярлыком в элементах управления WPF и WinForms?
У меня есть приложение WPF со следующим KeyBinding в главном окне:
<KeyBinding Command="Commands:EditCommands.Undo" Gesture="CTRL+Z" />
<KeyBinding Command="Commands:EditCommands.Redo" Gesture="CTRL+Y" />
Это заставляет команду нормально реагировать на ярлык. Однако во всех местах, где я встраивал текстовые поля WinForms или расширенные текстовые поля, я потерял возможность использовать эти ярлыки. Если я уберу вышеуказанные привязки, ярлыки WinForms будут работать нормально.
Как я могу поддерживать эти ярлыки как в WinForms, так и в WPF? Я бы предпочел универсальный метод, так как эта проблема может повлиять на многие другие команды с такими же клавишами.
1 ответ
Я озадачен, почему вы не используете встроенные команды:
ApplicationCommands.Undo
, а такжеApplicationCommands.Redo
Есть несколько преимуществ использования этих встроенных команд:
- Их привязки клавиш устанавливаются автоматически в зависимости от локали (Ctrl + Z и Ctrl + Y могут не быть клавишами отмены / возврата по умолчанию во всех локалях)
- Они удостоены чести
TextBox
а такжеRichTextBox
- Они без проблем пересекают границу WPF <-> WinForms
- Они работают с интерфейсами доступности
- Они вызываются встроенными клавишами отмены на клавиатурах, которые имеют их
Поэтому, если возможно, вы должны использовать встроенный ApplicationCommands
просто зарегистрировавшись CommandBindings
для них в соответствующих местах в вашем коде.
Дополнительная информация
Если вы используете встроенные функции отмены / повтора в WPF и WinForms, это просто работает. Например, следующее создает два RichTextBoxes
один на основе WinForms и один на WPF, и оба имеют полные возможности отмены / восстановления:
<UniformGrid Columns="2"
xmlns:winforms=
"clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms">
<WindowsFormsHost >
<winforms:RichTextBox />
</WindowsFormsHost>
<RichTextBox />
</UniformGrid>
Так как это работает, а у вас нет, попробуйте выяснить, что отличается. Вы сказали в своих комментариях, что вы пытались удалить пользовательский WPF InputBindings
, Вы сделали то же самое на стороне WinForms? Если нет, попробуйте или, если это невозможно, отредактируйте свой вопрос, чтобы показать этот код.
Обратите внимание, что вы можете переназначить ApplicationCommands
в свой RoutedCommands
: Просто добавьте CommandBinding
и в обработчике увольняй свой обычай RoutedCommand
,