弹窗

1、在Stylet框架,如果出现报错:System.InvalidOperationException:“只能在创建 Window 并且作为对话框显示之后才能设置 DialogResult。”
说明,你打开使用的方法是Show Window,而你关闭的时候使用了RequestClose(true);或者RequestClose(false);
改为

RequestClose();

就好了。
因为:
ShowWindow() 创建的是普通窗口(非模态窗口),这种窗口不支持 DialogResult 属性
ShowDialog() 创建的是模态对话框,这种窗口支持 DialogResult 属性
2、这里需要明确说明一点,使用IWindowManager打开的窗体,默认只有一个,不管你有没有注册单例,

  builder.Bind<ShellViewModel>().ToSelf().InSingletonScope();
  //或者
  builder.Bind<ShellViewModel>().ToSelf();

只要使用IWindowManager打开的默认只有一个,想要打开多个,只能从容器获取
例如:

_windowManager.ShowWindow(_container.Get<ShellViewModel>());

3、而Prism框架,恰好不一样,
问题本质
Stylet 的窗口管理机制:

Stylet 的 WindowManager 会跟踪已创建的窗口

即使 ViewModel 是新实例,Stylet 也会检查窗口是否已显示

这是为了防止窗口重复创建,但有时会导致不符合预期的行为

与 Prism 的差异:

Prism 的对话框服务每次都会创建新窗口,不跟踪已有实例

Stylet 更强调 MVVM 模式的严格性,Prism 更注重灵活性
在Prism注册的时候,即使注册了单例

 containerRegistry.RegisterSingleton<NoticeDialogViewModel>();
 containerRegistry.RegisterDialog<NoticeDialog>();

在使用窗体服务的时候

 private void ShowDialog()
 {
     var message = "这是一个 Dialog.";
     //using the dialog service as-is
     _dialogService.Show("NoticeDialog", new DialogParameters($"message={message}"), r =>
     {
         if (r.Result == ButtonResult.None)
             BackContent = "直接关闭";
         else if (r.Result == ButtonResult.OK)
             BackContent = "确定";
         else if (r.Result == ButtonResult.Cancel)
             BackContent = "返回";
         else
             BackContent = "报错";
     });
 }

这段代码也会打开多个,不过,因为设置了单例,弹窗的构造器只会运行一次

posted @ 2025-08-13 23:57  孤沉  阅读(19)  评论(0)    收藏  举报