Как лучше всего справиться с одним и тем же ярлыком в элементах управления 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

Есть несколько преимуществ использования этих встроенных команд:

  1. Их привязки клавиш устанавливаются автоматически в зависимости от локали (Ctrl + Z и Ctrl + Y могут не быть клавишами отмены / возврата по умолчанию во всех локалях)
  2. Они удостоены чести TextBox а также RichTextBox
  3. Они без проблем пересекают границу WPF <-> WinForms
  4. Они работают с интерфейсами доступности
  5. Они вызываются встроенными клавишами отмены на клавиатурах, которые имеют их

Поэтому, если возможно, вы должны использовать встроенный 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,

Другие вопросы по тегам