【问题标题】:How to make a WPF TextBox pass-through ApplicationCommands?如何使 WPF 文本框通过 ApplicationCommands?
【发布时间】:2011-10-27 17:30:14
【问题描述】:

WPF 文本框捕获 Ctrl-Z 和 Ctrl-Y 用于自己的撤消/重做。通常很好,但是在我们的应用程序中,我们有一些文本框,我不希望有这种行为,而是传递给整个应用程序以作为全局撤消处理。

我发现我可以通过为 ApplicationCommands.Undo/Redo 添加 CommandBindings 来覆盖文本框对这些的处理。

我的问题:如何将这些绑定“转发”到父框架元素,以便最终路由到我安装在主窗口上的应用程序处理程序?

更新:多亏了 AndrewS,我发现我需要的只是将 IsUndoEnabled 设置为 false。然后应用程序命令被忽略,顶层窗口可以处理它们。耶!

【问题讨论】:

    标签: wpf


    【解决方案1】:

    您必须为快捷方式注册一个 KeyBinding 并将其与 ApplicationCommands.NotACommand 关联。例如

        <TextBox>
            <TextBox.InputBindings>
                <KeyBinding Key="Y" Modifiers="Control" Command="NotACommand" />
                <KeyBinding Key="Z" Modifiers="Control" Command="NotACommand" />
            </TextBox.InputBindings>
        </TextBox>
    

    【讨论】:

    • 顺便说一句,您可能还想将 IsUndoEnabled 设置为 false,这样它就不会浪费内存来管理其撤消历史记录。
    • 嘿,这很有趣。甚至不知道 NotACommand 存在。出于好奇,如何将其本地化? (我假设中文键盘不使用 Ctrl+Z 来撤消。)
    • 我不知道有什么好的方法可以做到这一点。如果您查看 System.Windows.Input.ApplicationCommands.LoadDefaultGestureFromResource 方法(例如在反射器/uispy 中),他们会从自己的资源中获取密钥,但我不知道他们是否会显示它。您可能需要获取 ApplicationCommand.(Undo|Redo) 的 InputGestures,然后动态添加 InputBindings。您可以在自己的附加行为中做到这一点。
    • 另一个选项可能是在 TextBox 上为 CommandManager.CanExecute 事件添加一个处理程序(使用 AddHandler 并传递 true 以调用已处理的事件)。当 e.Command 为 Undo|Redo 时,您可以将 CanExecuteRoutedEventArgs 上的 ContinueRouting 设置为 true。
    • 那怎么样。事实证明,我需要做的就是将 IsUndoEnabled 设置为 false,然后直接传递命令。
    猜你喜欢
    • 2018-07-08
    • 2014-07-19
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    相关资源
    最近更新 更多