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

标签 wpf winforms keyboard-shortcuts winforms-interop

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

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

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

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

最佳答案

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

  • ApplicationCommands.Undo , 和
  • ApplicationCommands.Redo

  • 使用这些内置命令有几个优点:
  • 它们的键绑定(bind)会根据语言环境自动为您设置(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 .

    关于wpf - 在 WPF 和 WinForms 控件中处理相同快捷方式的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3041198/

    相关文章:

    android-studio - Android Studio中有没有从当前文件跳转到父类的快捷方式?

    c# - 通过网络浏览器从 silverlight 到 winforms 的通信

    c# - WPF : Can BinaryFormatter serialize FlowDocument instance?

    c# - 网格控件 WPF 的动态列

    c# - Wpf事件不冒泡

    .net - C# 浏览器组件添加 header 参数

    c# - 如何在 C# Windows 窗体应用程序中使用 Console.write()

    ios - iOS7键盘快捷键是如何实现的?

    vim - 为什么小写 [i] 在视觉 block 模式下不起作用?

    wpf - 如何根据 WPF 中的条件显示不同的控件?