5

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

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

这使得命令对快捷方式的响应很好。但是,在我嵌入了 WinForms 文本框或富文本框的所有地方,我都无法使用这些快捷方式。如果我删除上述绑定,WinForms 快捷方式工作正常。

如何在 WinForms 和 WPF 中支持这些快捷方式?我更喜欢通用方法,因为此问题可能会影响具有相同键绑定的许多其他命令。

4

1 回答 1

2

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

  • ApplicationCommands.Undo, 和
  • ApplicationCommands.Redo

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

  1. 它们的键绑定会根据语言环境自动为您设置(Ctrl+ZCtrl+Y可能不是所有语言环境中的默认撤消/重做键)
  2. 他们被授予TextBoxRichTextBox
  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

于 2010-06-15T07:31:40.070 回答