忽略键绑定中的重复(仅按住键 - 执行命令一次)



我使用键绑定在我的 xaml 中声明了键盘快捷键。我想忽略由于其中少数几个关键持有而导致的重复。

我只找到了使用事件和检查"IsRerepeat"的解决方案,这并不适合我的键绑定声明。

当然,我可以在命令定义本身中执行此操作,并测量上次执行 2 次之间的时间差,但这让我无法区分多次按下和 1 次按键持有。

仅在第一次按下时执行并在按住键时忽略其余部分的最佳方法是什么?

您正在尝试更改按钮的行为。最好为此使用代码。最简单的方法是将预览事件附加到窗口,如下所示:

<Window 
       ...
          PreviewKeyDown="HandlePreviewKeyDown">

然后在代码中像这样处理它:

    private void HandlePreviewKeyDown(object sender, KeyEventArgs e)
    {
        if (e.IsRepeat)
        {
            e.Handled = true;
        }
    }

遗憾的是,这将禁用任何重复行为,即使在表单托管的文本框中也是如此。这是一个有趣的问题。 如果我找到一种更优雅的方式来做到这一点,我会补充答案。

编辑:

好的,有两种方法可以定义键绑定。

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.InputBindings>
        <KeyBinding x:Name="altD" Gesture="Alt+D" Command="{Binding ClickCommand}"/>
    </Window.InputBindings>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
            <RowDefinition/>
        </Grid.RowDefinitions>
            <Button Content="_Click" Command="{Binding ClickCommand}" />
        <TextBox Grid.Row="1"/>
    </Grid>
</Window>

上面的按钮将生成单击,因为您通过下划线隐式请求了 Alt-C 手势:_Click内容。 然后,窗口具有到 Alt+D 的显式键绑定。

此代码隐藏现在应该适用于这两种情况,并且不应干扰定期重复:

protected override void OnPreviewKeyDown(KeyEventArgs e)
    {
        base.OnPreviewKeyDown(e);
        if (e.IsRepeat)
        {
            if (((KeyGesture)altD.Gesture).Matches(this, e))
            {
                e.Handled = true;
            }
            else if (e.Key == Key.System)
            {
                string sysKey = e.SystemKey.ToString();
                //We only care about a single character here: _{character}
                if (sysKey.Length == 1 && AccessKeyManager.IsKeyRegistered(null, sysKey))
                {
                    e.Handled = true;
                }
            }
        }
    }
我想

说的是,如果您创建一个非常简单的状态机,该状态机将对KeyDown事件的KeyBinding执行操作,并忽略所有其他输入,直到触发KeyUp事件以赋予KeyBinding"一次性"行为。

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.keyup.aspx

使用 keyUp 方法而不是 KeyDown。

最新更新