Как лучше всего справиться с одним и тем же ярлыком в элементах управления WPF и WinForms? - PullRequest
4 голосов
/ 15 июня 2010

У меня есть приложение WPF со следующей привязкой клавиш в главном окне:

<KeyBinding Command="Commands:EditCommands.Undo" Gesture="CTRL+Z" />
<KeyBinding Command="Commands:EditCommands.Redo" Gesture="CTRL+Y" />

Это заставляет команду нормально реагировать на ярлык. Однако во всех местах, где я встраивал текстовые поля WinForms или расширенные текстовые поля, я потерял возможность использовать эти ярлыки. Если я уберу вышеуказанные привязки, ярлыки WinForms будут работать нормально.

Как я могу поддерживать эти ярлыки как в WinForms, так и в WPF? Я бы предпочел универсальный метод, так как эта проблема может повлиять на многие другие команды с такими же сочетаниями клавиш.

1 Ответ

2 голосов
/ 15 июня 2010

Я озадачен, почему вы не используете встроенные команды:

  • 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...