如何让对话框右上角[X]关闭按钮返回带参数的DialogResult
问题解决方法
你不需要移除对话框右上角自带的X关闭按钮,直接通过Prism对话框的生命周期拦截逻辑即可实现需求——不管通过哪种方式触发对话框关闭,框架都会调用IDialogAware接口定义的OnDialogClosing方法,你只需要在这个方法里统一补全返回参数即可。
具体实现
保留你原有的确认按钮关闭逻辑不用改,在对话框对应的ViewModel中重写OnDialogClosing方法,适配点X关闭的场景即可,注意不同Prism版本方法签名略有区别,根据你引用的版本选对应写法:
- Prism 8.x 及以上版本写法
public override void OnDialogClosing() { // 已经通过确认按钮触发关闭的场景,已经赋值过参数,直接跳过 if (CanCloseDialog) return; // 点X触发关闭的场景,补全参数和返回结果 CanCloseDialog = true; DialogParameters parm = new DialogParameters(); parm.Add("CreatedGroups", _createdGroups); DialogResult = new DialogResult(ButtonResult.OK, parm); }
- Prism 7.x版本写法
public override void OnDialogClosing(DialogClosingEventArgs args) { // 判断当前关闭请求是否已经携带目标参数 if (args.Result?.Parameters?.ContainsKey("CreatedGroups") != true) { DialogParameters parm = new DialogParameters(); parm.Add("CreatedGroups", _createdGroups); args.Result = new DialogResult(ButtonResult.OK, parm); } CanCloseDialog = true; }
注意事项
- 不要直接给窗口右上角X按钮挂自定义点击事件,Prism对对话框窗口做了封装,直接修改原生按钮事件很容易破坏框架内置的对话框生命周期,导致内存泄漏或者返回值异常。
- 重写
OnDialogClosing的方式会覆盖所有关闭入口(包括按Alt+F4、点X、点自定义按钮),可以保证所有关闭路径都能正确返回你需要的CreatedGroups参数,不需要单独为每个关闭入口写重复逻辑。
内容的提问来源于stack exchange,提问作者リムウェイ チェン
相关产品推荐
相关产品推荐

