WPF文本框允许键绑定撤消气泡

wf82jlnq  于 2023-11-21  发布在  其他
关注(0)|答案(1)|浏览(162)

在我们的应用程序中,我通过允许键绑定事件冒泡到主窗口视图来处理键绑定,在主窗口视图中,键绑定是在xaml中定义的,并在主窗口视图模型中处理,例如,

<Window.InputBindings>
    <KeyBinding Key="Left" Modifiers="Alt" Command="{Binding NavigateBackCommand}"/>
    <KeyBinding Key="Right" Modifiers="Alt" Command="{Binding NavigateForwardCommand}"/>
    <KeyBinding Key="c" Modifiers="Control" Command="{Binding CopyCommand}"/>
    <KeyBinding Key="v" Modifiers="Control" Command="{Binding PasteCommand}"/>
    <KeyBinding Key="d" Modifiers="Control" Command="{Binding DuplicateCommand}"/>
    <KeyBinding Key="n" Modifiers="Control" Command="{Binding AddCommand}"/>
    <KeyBinding Key="i" Modifiers="Control" Command="{Binding ImportCommand}"/>
    <KeyBinding Key="e" Modifiers="Control" Command="{Binding ExportCommand}"/>
    <KeyBinding Key="a" Modifiers="Control" Command="{Binding SelectAllCommand}"/>
    <KeyBinding Key="k" Modifiers="Control" Command="{Binding DeselectCommand}"/>
    <KeyBinding Key="z" Modifiers="Control" Command="{Binding UndoCommand}"/>
    <KeyBinding Key="y" Modifiers="Control" Command="{Binding RedoCommand}"/>
    <KeyBinding Key="z" Modifiers="Control+Shift" Command="{Binding RedoCommand}"/>
    <KeyBinding Key="F5" Command="{Binding RefreshCommand}"/>
    <KeyBinding Key="Delete" Command="{Binding DeleteCommand}"/>
    <KeyBinding Key="Escape" Command="{Binding EscapeCommand}"/>
</Window.InputBindings>

字符串
这很好用,除了TextBox控件,在那里撤销事件(“Ctrl+Z”)从来没有出现冒泡到主窗口。我已经在TextBox上设置了IsUndoEnabled为false,但它仍然没有出现冒泡。这几乎就像TextBox正在处理事件,从而防止它冒泡。
我已经在自定义TextBoxMyTextBox)中使用以下方法进行了修复,即在控件中侦听CommandBinding,并在窗口中查找KeyBinding并执行相关命令

public MyTextBox()
{
    IsUndoEnabled = false;

    CommandBindings.Add(new CommandBinding(
        ApplicationCommands.Undo,
        ((sender, args) =>
        {
            var window = Window.GetWindow(this);

            foreach (var keyBinding in window.InputBindings.OfType<KeyBinding>())
            {
                if (keyBinding.Key == Key.Y && keyBinding.Modifiers == ModifierKeys.Control)
                {
                    keyBinding.Command.Execute(null);
                }
            }
        })));
 }


但是这看起来很奇怪,有没有办法禁用TextBox内置的撤销命令,而让键绑定冒泡,这样我就可以处理它了?

5lhxktic

5lhxktic1#

这几乎就像是TextBox在处理事件,从而防止它一直冒泡。
它就是这么做的。
有没有办法禁用TextBox内置的撤销命令,而是允许键绑定冒泡,这样我就可以处理它了?
不是没有实现某种“黑客”就像你已经做过的。你的解决方案创建一个自定义的TextBox来处理这一点,实际上是一个很好的解决方案,在我看来。
恐怕没有属性或类似的东西可以让你设置来获得你想要的行为,也就是说,TextBox允许事件在没有任何自定义实现的情况下冒泡。

相关问题