2010-06-14 4 views
4

У меня есть приложение WPF с помощью следующей KeyBinding на главном окне:Каков наилучший способ обработки одного и того же ярлыка в элементах управления WPF и WinForms?

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

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

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

ответ

2

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

  • ApplicationCommands.Undo и
  • ApplicationCommands.Redo

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

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

Поэтому, если возможно, вы должны использовать встроенный ApplicationCommands, просто зарегистрировав CommandBindings для них в соответствующих местах вашего кода.

Дополнительная информация

Если вы используете встроенную функциональность Undo/Redo как в 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.

+0

Мы используем базовый класс для наших команд, у которых есть делегаты в команде, поэтому мы определили все наши команды. Нам было проще перемещать команды Undo/Redo. Но независимо от того, даже если я использую встроенную команду, я все равно получаю ту же проблему. Вводные привязки WPF блокируют одни и те же привязки от работы с текстовыми полями WinForms. –

+0

Что-то странное происходит, так как это нормально работает. Я добавил дополнительную информацию в свой ответ, чтобы помочь вам отследить ее. Это может иметь какое-то отношение к тому, как вы перехватываете Ctrl-Y и Ctrl-Z на стороне WinForms изображения. –

+0

Хотя это может работать для этих специальных клавиш быстрого доступа, оно фактически не отвечает на вопрос или не помогает мне, так как я * не * использую встроенные команды. –