Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 忽略KeyBinding中的重复(仅持有key-execute命令一次)_C#_Wpf_Xaml_Mvvm_Keyboard Shortcuts - Fatal编程技术网

C# 忽略KeyBinding中的重复(仅持有key-execute命令一次)

C# 忽略KeyBinding中的重复(仅持有key-execute命令一次),c#,wpf,xaml,mvvm,keyboard-shortcuts,C#,Wpf,Xaml,Mvvm,Keyboard Shortcuts,我在xaml中使用键绑定声明了键盘快捷键。 我想忽略重复,因为在其中的几个关键举行 我只找到了使用事件和检查“IsRepetition”的解决方案,这并不真正适合我的键绑定声明 当然,我可以在命令定义中这样做,并测量最后两次执行之间的时间差,但这无法区分多次按下和一次按住键 如果按键处于按住状态,那么只有在第一次按下时才执行而忽略其余按键的最佳方式是什么?我想说的是,如果您创建一个非常简单的状态机,它将在按键事件上对按键绑定执行操作,并忽略所有其他输入,直到触发按键向上事件,从而使按键绑定具有“

我在xaml中使用键绑定声明了键盘快捷键。 我想忽略重复,因为在其中的几个关键举行

我只找到了使用事件和检查“IsRepetition”的解决方案,这并不真正适合我的键绑定声明

当然,我可以在命令定义中这样做,并测量最后两次执行之间的时间差,但这无法区分多次按下和一次按住键


如果按键处于按住状态,那么只有在第一次按下时才执行而忽略其余按键的最佳方式是什么?

我想说的是,如果您创建一个非常简单的状态机,它将在按键事件上对按键绑定执行操作,并忽略所有其他输入,直到触发按键向上事件,从而使按键绑定具有“一次性”行为


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

<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>

使用keyUp方法而不是KeyDown。

我看不到一种方法可以轻松地将其集成到现有标记中,处理命令是我试图避免的。谢谢。但是,我只希望在少数命令中使用此行为,而不是在所有键盘输入中使用此行为:(
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;
                }
            }
        }
    }