gpt4 book ai didi

c# - PreviewExecuted 后未调用 Executed

转载 作者:行者123 更新时间:2023-11-30 14:53:10 24 4
gpt4 key购买 nike

这是我的代码:

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 处理程序(CommandBindings.cs,OnExecuted)后它永远不会为假:

PreviewExecuted(sender, e);
e.Handled = true;

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

为什么会这样,我不知道。 PreviewCanExecute 的工作方式相同,但它仅在 e.CanExecute 设置为 true 时将 e.Handled 设置为 true - 如果您在您的预览处理程序,无论 e.Handled 是什么,都不会调用 CanExecute 处理程序。

我的假设是“如果未处理预览事件”是“如果预览事件没有注册处理程序”的不幸措辞/em>”。

关于c# - PreviewExecuted 后未调用 Executed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30123802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com