在我们的应用程序中,我通过允许键绑定事件冒泡到主窗口视图来处理键绑定,在主窗口视图中,键绑定是在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
正在处理事件,从而防止它冒泡。
我已经在自定义TextBox
(MyTextBox
)中使用以下方法进行了修复,即在控件中侦听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
内置的撤销命令,而让键绑定冒泡,这样我就可以处理它了?
1条答案
按热度按时间5lhxktic1#
这几乎就像是TextBox在处理事件,从而防止它一直冒泡。
它就是这么做的。
有没有办法禁用TextBox内置的撤销命令,而是允许键绑定冒泡,这样我就可以处理它了?
不是没有实现某种“黑客”就像你已经做过的。你的解决方案创建一个自定义的
TextBox
来处理这一点,实际上是一个很好的解决方案,在我看来。恐怕没有属性或类似的东西可以让你设置来获得你想要的行为,也就是说,
TextBox
允许事件在没有任何自定义实现的情况下冒泡。