Prism框架中DialogWindow无法显示自定义窗口仅弹出极小空白窗口问题
问题原因及解决方案
你的错误主要出在Prism对话框的调用逻辑和注册配置两个核心环节:
对话框调用方式错误
你直接通过构造注入IDialogWindow并调用Show()方法的逻辑不符合Prism对话框的使用规范。IDialogWindow是Prism定义的对话框宿主接口,你直接注入的是容器中默认的无内容实现,没有关联你写的WindowAView布局和对应视图模型,所以会出现宽高为0的极小空白窗口。
正确做法是注入IDialogService服务,通过服务提供的Show/ShowDialog方法唤起你注册的自定义对话框。对话框注册参数错误
你调用containerRegistry.RegisterDialog<WindowA>()时传入的泛型参数错误,你实际的对话框视图类是WindowAView,这里需要传入正确的视图类,Prism会自动关联你标记了prism:ViewModelLocator.AutoWireViewModel="True"对应的WindowAViewModel。可选优化项
你当前的WindowAViewModel的Title属性未赋值,会导致对话框标题为空,可在构造函数中为Title赋值。
修复后的代码示例
模块代码修改
public class TestModule : IModule { IDialogService _dialogService; // 注入IDialogService而非IDialogWindow public TestModule(IDialogService dialogService) { _dialogService = dialogService; } public void OnInitialized(IContainerProvider containerProvider) { // 调用Show方法,传入注册的对话框名称(默认是视图类名) _dialogService.Show(nameof(WindowAView)); } public void RegisterTypes(IContainerRegistry containerRegistry) { // 泛型参数改为实际的对话框视图类 containerRegistry.RegisterDialog<WindowAView>(); // 如果需要自定义对话框名称,可使用重载: // containerRegistry.RegisterDialog<WindowAView, WindowAViewModel>("CustomDialogName"); } }
视图模型代码修改(可选)
class WindowAViewModel : IDialogAware { public WindowAViewModel() { // 为对话框标题赋值 Title = "WindowA"; } public string Title { get; } public event Action<IDialogResult> RequestClose; public bool CanCloseDialog() { return true; } public void OnDialogClosed() { } public void OnDialogOpened(IDialogParameters parameters) { } }
你已经实现的WindowAView的IDialogWindow接口逻辑无需修改,调整以上两处核心问题后即可正常弹出预期的对话框。
内容的提问来源于stack exchange,提问作者alexei.sorokin
相关产品推荐
相关产品推荐

