代码之家  ›  专栏  ›  技术社区  ›  Anthony Brien

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

  •  4
  • Anthony Brien  · 技术社区  · 14 年前

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

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

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

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

    1 回复  |  直到 13 年前
        1
  •  2
  •   Jasper wontondon    13 年前

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

    • ApplicationCommands.Undo
    • ApplicationCommands.Redo

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

    1. 它们的键绑定是根据区域设置自动为您设置的。( Ctrl键 + Z Ctrl键 + Y 可能不是所有区域设置中的默认撤消/重做键)
    2. 他们很荣幸 TextBox RichTextBox
    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方面也做过同样的工作吗?如果没有,请尝试,或者如果不可能,请编辑您的问题以显示该代码。

    请注意,您可以重新映射 应用程序命令 进入你自己 RoutedCommands 只要添加一个 CommandBinding 在处理程序中启动您的自定义 RoutedCommand .