Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';在WPF和WinForms控件中处理相同快捷方式的最佳方法是什么?_Wpf_Winforms_Keyboard Shortcuts_Winforms Interop - Fatal编程技术网

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

什么';在WPF和WinForms控件中处理相同快捷方式的最佳方法是什么?,wpf,winforms,keyboard-shortcuts,winforms-interop,Wpf,Winforms,Keyboard Shortcuts,Winforms Interop,我有一个WPF应用程序,其主窗口上有以下键绑定: <KeyBinding Command="Commands:EditCommands.Undo" Gesture="CTRL+Z" /> <KeyBinding Command="Commands:EditCommands.Redo" Gesture="CTRL+Y" /> 这会使命令对快捷方式做出良好的响应。然而,在所有嵌入WinForms文本框或富文本框的地方,我都失去了使用这些快捷方式的能力。如果删除上述绑定,

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

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

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


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

我不明白为什么不使用内置命令:

  • 应用程序命令。撤消
    ,以及
  • ApplicationCommands.Redo
使用这些内置命令有几个优点:

  • 它们的键绑定是根据区域设置自动为您设置的(Ctrl+Z和Ctrl+Y可能不是所有区域设置中的默认撤消/重做键)
  • 他们被授予
    TextBox
    RichTextBox
  • 它们跨越WPF WinForms边界没有任何问题
  • 它们使用可访问性接口
  • 它们由键盘上的内置“撤消”键调用
  • 因此,如果可能,您应该使用内置的
    应用程序命令
    ,只需在代码中的适当位置为它们注册
    命令绑定

    更多信息

    如果在WPF和WinForms中都使用内置的撤消/重做功能,它就可以正常工作。例如,下面创建了两个
    richtextbox
    ,一个基于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方面也这么做了吗?如果没有,请尝试,或者如果不可能,请编辑您的问题以显示代码


    请注意,您可以将
    应用程序命令
    重新映射到您自己的
    路由命令
    :只需添加一个
    命令绑定
    ,然后在处理程序中启动您的自定义
    路由命令

    我们为命令使用一个基类,在命令中具有正确的委托,因此我们像这样定义了所有命令。对于我们来说,将Undo/Redo命令移动到那里更简单。但无论如何,即使我使用内置命令,我仍然会遇到同样的问题。WPF输入绑定阻止相同的绑定在WinForms文本框上工作。由于这正常工作,出现了一些奇怪的情况。我在答案中添加了更多信息,以帮助您找到答案。这可能与您如何在图片的WinForms端截取Ctrl-Y和Ctrl-Z有关。虽然这可能适用于那些特定的快捷键,但它实际上并不能回答问题或帮助我,因为我没有使用内置命令。@Tom Ritter:实际上,这个问题是专门针对WinForms有内置绑定的情况提出的,例如Ctrl-Y和Ctrl-Z。当没有内置绑定时,没有问题,因为主窗口上的WPF绑定完全按照预期工作。如果您还有其他考虑,我建议您在Stack Overflow上发布一个新问题,解释您的具体需求。