PreviewExecuted 后未调用 Executed
Executed gets not called after PreviewExecuted
这是我的代码:
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();
}
MSDN 说:“...如果未处理预览事件,则会在命令目标上引发已执行事件。”
这对 PreviewCanExecute 事件确实有效。但在这种情况下,当 PreviewExecuted-Event 正在侦听时,不会调用 Executed-Event。
我没有找到与此主题相关的任何内容,所以我想问一下,该行为是有意为之还是不正确。
看来您将 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);
}
...
}
所以确实,如果 e.Handled
在预览事件之后是 false
,那么应该引发 Executed
事件。但在调用 PreviewExecuted
处理程序后它永远不会为 false (CommandBindings.cs, OnExecuted):
PreviewExecuted(sender, e);
e.Handled = true;
它只是在调用预览处理程序后将 e.Handled
设置为 true...
为什么会这样,我不知道。 PreviewCanExecute
的工作方式相同,但它仅在 e.CanExecute
设置为 true 时将 e.Handled
设置为 true - 如果您在预览处理程序中这样做,CanExecute
处理程序将不会无论 e.Handled
.
都不会被调用
我的假设是“如果未处理预览事件”是不幸的措辞“如果预览事件不处理有一个注册的处理程序”。
这是我的代码:
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();
}
MSDN 说:“...如果未处理预览事件,则会在命令目标上引发已执行事件。”
这对 PreviewCanExecute 事件确实有效。但在这种情况下,当 PreviewExecuted-Event 正在侦听时,不会调用 Executed-Event。
我没有找到与此主题相关的任何内容,所以我想问一下,该行为是有意为之还是不正确。
看来您将 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);
}
...
}
所以确实,如果 e.Handled
在预览事件之后是 false
,那么应该引发 Executed
事件。但在调用 PreviewExecuted
处理程序后它永远不会为 false (CommandBindings.cs, OnExecuted):
PreviewExecuted(sender, e);
e.Handled = true;
它只是在调用预览处理程序后将 e.Handled
设置为 true...
为什么会这样,我不知道。 PreviewCanExecute
的工作方式相同,但它仅在 e.CanExecute
设置为 true 时将 e.Handled
设置为 true - 如果您在预览处理程序中这样做,CanExecute
处理程序将不会无论 e.Handled
.
我的假设是“如果未处理预览事件”是不幸的措辞“如果预览事件不处理有一个注册的处理程序”。