弹窗
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 = "报错";
});
}
这段代码也会打开多个,不过,因为设置了单例,弹窗的构造器只会运行一次

浙公网安备 33010602011771号