在PreviewExecuted之后执行未被调用

Ste*_*han 3 c# wpf routed-commands

这是我的代码:

var commandBinding = new CommandBinding(ApplicationCommand.New);
commandBinding.PreviewExecuted += OnPreviewExecuted;
commandBinding.Executed += OnExecuted;
CommandBindings.Add(commandBinding);

void OnPreviewExecuted(object sender, ExecutedRoutedEventArgs e) {
  e.Handled = false;
}

void OnExecuted(object sender, ExecutedRoutedEventArgs e) {
  DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

MSDN说:"......如果未处理预览事件,则会在命令目标上引发Executed事件."

这对PreviewCanExecute事件可以正常工作.但在这种情况下,当PreviewExecuted-Event正在侦听时,不会调用Executed-Event.

我没有找到关于这个主题的任何内容,所以我想问一下,这个行为是有意还是不正确.

svi*_*nja 5

似乎你设置的并不重要e.Handled.

以下是决定要引发哪些事件的代码(RoutedCommand.cs中的ExecuteImpl):

ExecutedRoutedEventArgs args = new ExecutedRoutedEventArgs(this, parameter);
args.RoutedEvent = CommandManager.PreviewExecutedEvent;

if (targetUIElement != null)
{
    targetUIElement.RaiseEvent(args, userInitiated);
}
else
{
    ...
}

if (!args.Handled)
{
    args.RoutedEvent = CommandManager.ExecutedEvent;
    if (targetUIElement != null)
    {
        targetUIElement.RaiseEvent(args, userInitiated);
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

实际上,如果e.Handledfalse在预览事件之后,则Executed应该引发该事件.但是在PreviewExecuted调用处理程序后它永远不会出错(CommandBindings.cs,OnExecuted):

PreviewExecuted(sender, e);
e.Handled = true;
Run Code Online (Sandbox Code Playgroud)

它只是e.Handled在调用预览处理程序后设置为true ...

为什么会这样,我不知道.PreviewCanExecute以相同的方式工作,但只有设置e.Handled为true 才e.CanExecute设置为true - 如果在预览处理程序中执行此操作,则CanExecute无论如何都不会调用处理程序e.Handled.

我的假设是" 如果未处理预览事件 "是" 如果预览事件没有注册处理程序 " 的不幸措辞.