gpt4 book ai didi

wpf - 如何从 WPF 中的子控件中获取键盘?

转载 作者:行者123 更新时间:2023-12-04 16:45:54 24 4
gpt4 key购买 nike

我在窗口中有一些输入绑定(bind):

<Window.InputBindings>
<KeyBinding Key="Space" Command="{Binding Path=StepNext}" />
<KeyBinding Key="R" Command="{Binding Path=ResetSong}" />
<KeyBinding Key="Left" Command="{Binding Path=StepPrevious}" />
</Window.InputBindings>

这些命令在我的 View 模型中定义为 RelayCommands:
public class RelayCommand : ICommand
{
private Action<object> _exec;
private Func<object, bool> _canExec;

public RelayCommand(Action<object> exec, Func<object, bool> canExec)
{
_exec = exec;
_canExec = canExec;
}

public void Execute(object parameter)
{
_exec(parameter);
}

public bool CanExecute(object parameter)
{
return _canExec(parameter);
}

public event EventHandler CanExecuteChanged;
}

在 ViewModel 的构造函数中:
StepNext = new RelayCommand(DoStepNext, CanStepNext);

这工作正常。但是,每当我在列表框中选择一个项目(它是 Window 的子项)时,KeyBindings 就会停止工作。无论哪个 child 有焦点(如果有),我如何让 parent 捕获键绑定(bind)。 (事件不应该冒泡吗?)

我知道有一个 PreviewKeyDown 事件可以做到这一点,但这会使我的 ICommand s 没用,所以如果可能的话,我更喜欢声明性的解决方案。

提前致谢。

最佳答案

据我所知,没有任何声明方式可以使处理的事件继续冒泡。

如您所说,最简单的方法是处理Preview事件。

作为替代方案,您可以覆盖您的 ListBox类 OnKeyDown 方法如下:

protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
if (e.Key == Key.Space || e.Key == Key.Left)
e.Handled = false;
}

关于wpf - 如何从 WPF 中的子控件中获取键盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3826651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com