这就是我在我的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
,则对话框会显示两次。
出现这种情况的原因是什么?
答案 0 :(得分:2)
查看MSDN以及this SO post,我可以通过两种方式了解您为什么要两次获得该活动。要确定,请为事物添加事件处理程序,并查看哪些事件被调用。
PreviewCanExecute
和CanExecute
事件但是,您错误地使用了CanExecute
。 CanExecute
应仅返回true
或false
。用户应该不知道自己被调用了。我所看到的一个有用的用途是菜单。如果你给它一个绑定,并且它不能执行,菜单项将显示为灰色。
因此,如果用户无论如何都可以点击它,那么您应该在MessageBox
方法中使用Executed
,而不是CanExecute
方法。