You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XAF框架中快捷键触发操作时通知与加载动画不显示求助

解决XAF Blazor快捷键触发Action无通知和加载动画的问题

问题核心是:快捷键触发的回调不在XAF的UI执行上下文里,导致Action执行时没有触发XAF内置的加载动画、异常通知等UI逻辑。直接调用OpenPopup或DoExecute跳过了XAF的Action生命周期处理,而鼠标点击按钮时,XAF会自动处理这些上下文。

修复步骤

  1. 替换直接调用OpenPopup的逻辑,改用XAF标准的DoExecute方法触发Action
  2. 将Action执行逻辑包装到XAF的UI线程上下文中,确保XAF能处理加载状态和异常通知

修改后的代码

protected CustomActionController() {
     selectItemAction = new QpPopupWindowShowAction(this, "Select", PredefinedCategory.PopupActions)
     {
         Caption = "Select F5",
         IsModal = true,
         ImageName = "Find"
     };
}
protected override async void OnActivated()
{
    base.OnActivated();

    hotKeys = ((BlazorApplication) Application).ServiceProvider.GetRequiredService<HotKeys>();
    hotKeysContext = hotKeys.CreateContext()
        .Add(Code.F5, SelectItem, "Open Select Item Popup");

    var jsRuntime = ((BlazorApplication)Application).ServiceProvider.GetRequiredService<IJSRuntime>();
    await jsRuntime.InvokeVoidAsync("enableBrowserShortcut");

    selectItemAction.CustomizePopupWindowParams += SelectItemAction_CustomizePopupWindowParams;
}

private void SelectItemAction_CustomizePopupWindowParams(object sender, CustomizePopupWindowParamsEventArgs e)
{
    var controller = GetControllerForViewItem<TransactionActionController>("Transactions");
    switch (controller.View.SelectedObjects.Count)
    {
        case 0:
            throw new UserFriendlyException("Please check an item to process");
        case > 1:
            throw new UserFriendlyException("One item at a time please.");
    }

    var taskPrefix = "Customer Updates: Select: ";
    var popupObjectSpace = Application.CreateObjectSpace<SystemTask>();
    var tasksCollectionSource = TasksManager.GetTaskCollectionSource(popupObjectSpace, taskPrefix);
    e.View = Application.CreateListView("Task_Selector", tasksCollectionSource, true);
    e.DialogController.AcceptAction.Caption = "Process";
}

public async void SelectItem()
{
    // 切换到XAF的UI上下文执行,确保触发完整的Action生命周期
    await ((BlazorApplication)Application).MainWindow.View.Dispatcher.InvokeAsync(() =>
    {
        // 用DoExecute触发Action,而不是直接调用OpenPopup
        selectItemAction.DoExecute(null);
    });
}

关键说明

  • Dispatcher.InvokeAsync确保代码在XAF的UI线程上下文中执行,让XAF能够启动加载动画、捕获UserFriendlyException并显示底部通知
  • 调用Action.DoExecute(null)是XAF标准的Action触发方式,会完整执行Action的生命周期(包括参数验证、弹窗创建、异常处理等),而子类的OpenPopup方法可能跳过了这些内置逻辑

内容的提问来源于stack exchange,提问作者B2K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:55:13