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

时间:2010-06-14 21:49:00

标签: wpf winforms keyboard-shortcuts winforms-interop

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

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

这使命令响应快捷方式。但是,在我嵌入WinForms文本框或富文本框的所有地方,我都失去了使用这些快捷方式的能力。如果我删除上面的绑定,WinForms快捷方式可以正常工作。

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

1 个答案:

答案 0 :(得分:2)

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

  • ApplicationCommands.Undo
  • ApplicationCommands.Redo

使用这些内置命令有几个好处:

  1. 他们的键绑定是根据区域设置自动设置的( Ctrl + Z Ctrl + Y 可能不是所有语言环境中的默认撤消/重做键)
  2. 他们受到TextBoxRichTextBox
  3. 的尊重
  4. 他们越过WPF&lt; - &gt; WinForms边界没有任何问题
  5. 他们使用辅助功能接口
  6. 它们由带有它们的键盘上的内置“撤销”键调用
  7. 因此,如果可能,您应该使用内置的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