CommandBindings快捷键执行两次

时间:2016-06-28 15:59:05

标签: c# wpf xaml

这就是我在我的wpf应用程序中实现快捷方式的方式:

public static class Shortcuts
    {
        static Shortcuts()
        {
            StartScanningCommand = new RoutedCommand();
            StartScanningCommand.InputGestures.Add(new KeyGesture(Key.S, ModifierKeys.Control));
}

 public readonly static RoutedCommand StartScanningCommand;
}

在我的xaml视图中,我有这个:

<Window.CommandBindings>
        <CommandBinding Command="{x:Static local:Shortcuts.StartScanningCommand}" x:Name="StartScanningCommand" Executed="StartScanningCommand_Executed" CanExecute="StartScanningCommand_CanExecute"/>    
</Window.CommandBindings>

在xaml的课堂上:

private void StartScanningCommand_Executed(object sender, ExecutedRoutedEventArgs e)
            {
                Scanner.Start();
            }
        private void StartScanningCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {

            e.CanExecute = AppCurrent.GetPermissionManager().CanScan();
            if (!e.CanExecute)
            {
                AppCurrent.Broadcasts.ApplicationStatusBroadcast.NotifySubscribers(this, new ApplicationStatusEventArgs("You dont have permission to scan", StatusType.Error));
            }
        }

但由于某种原因StartScanningCommand_CanExecute执行两次。如果我在方法中放置MessageBox.Show,则对话框会显示两次。

出现这种情况的原因是什么?

1 个答案:

答案 0 :(得分:2)

查看MSDN以及this SO post,我可以通过两种方式了解您为什么要两次获得该活动。要确定,请为事物添加事件处理程序,并查看哪些事件被调用。

  1. 要求PreviewCanExecuteCanExecute事件
  2. 当对象接收到键盘焦点时,以及释放鼠标时调用
  3. 但是,您错误地使用了CanExecuteCanExecute应仅返回truefalse。用户应该不知道自己被调用了。我所看到的一个有用的用途是菜单。如果你给它一个绑定,并且它不能执行,菜单项将显示为灰色。

    因此,如果用户无论如何都可以点击它,那么您应该在MessageBox方法中使用Executed,而不是CanExecute方法。