XAF框架中快捷键触发操作时通知与加载动画不显示求助
解决XAF Blazor快捷键触发Action无通知和加载动画的问题
问题核心是:快捷键触发的回调不在XAF的UI执行上下文里,导致Action执行时没有触发XAF内置的加载动画、异常通知等UI逻辑。直接调用OpenPopup或DoExecute跳过了XAF的Action生命周期处理,而鼠标点击按钮时,XAF会自动处理这些上下文。
修复步骤
- 替换直接调用
OpenPopup的逻辑,改用XAF标准的DoExecute方法触发Action - 将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
相关产品推荐
相关产品推荐

