Я озадачен, почему вы не используете встроенные команды:
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
.