在WPF和WinForms控件中处理相同快捷键的最佳方法是什么?

5

我有一个WPF应用程序,在其主窗口上有以下KeyBinding:

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

这使得命令能够很好地响应快捷方式。然而,在我嵌入WinForms文本框或富文本框的所有位置上,我失去了使用这些快捷键的能力。如果我删除上述绑定,则WinForms快捷键可以正常工作。
如何在WinForms和WPF中都支持这些快捷键?我希望使用一种通用方法,因为这个问题很可能会影响到许多其他具有相同按键绑定的命令。
1个回答

2

我很困惑为什么你不使用内置的命令:

  • ApplicationCommands.Undo,以及
  • ApplicationCommands.Redo

使用这些内置命令有几个优点:

  1. 它们的按键绑定会根据语言环境自动设置(在所有语言环境中,Ctrl + ZCtrl + Y 可能不是默认的撤销/重做快捷键)
  2. 它们受到 TextBoxRichTextBox 的尊重
  3. 它们可以在 WPF 和 WinForms 之间无缝切换
  4. 它们与辅助功能接口兼容
  5. 当键盘上有内置的“撤销”键时,它们会被触发

因此,如果可能的话,你应该通过在代码的适当位置注册 CommandBindings 来使用内置的 ApplicationCommands

更多信息

如果你在 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 即可。


我们为命令使用一个基类,该基类在命令中具有委托,因此我们定义了所有命令。对于我们将撤消/重做命令移动到那里来说,这更简单。但是,即使我使用内置命令,我仍然遇到相同的问题。WPF输入绑定会阻止WinForms文本框上的相同绑定工作。 - Anthony Brien
有些奇怪的事情正在发生,因为这通常是有效的。我已经添加了更多信息到我的答案中,以帮助你追踪它。这可能与你在WinForms方面拦截Ctrl-Y和Ctrl-Z的方式有关。 - Ray Burns
虽然这可能适用于那些特定的快捷键,但它实际上并没有回答问题或帮助我,因为我使用内置命令。 - Tom Ritter
@Tom Ritter:实际上,这个问题特别涉及到WinForms内置绑定会妨碍操作的情况,例如Ctrl-Y和Ctrl-Z。如果没有内置绑定,那么就没有问题,因为主窗口上的WPF绑定会按预期工作。如果您有其他考虑因素,我建议您在Stack Overflow上发布一个新问题,解释您的具体需求。 - Ray Burns

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接