Prism 中的 DialogWindow 不显示我的窗口

Posted

技术标签:

【中文标题】Prism 中的 DialogWindow 不显示我的窗口【英文标题】:DialogWindow in Prism does not show my window 【发布时间】:2021-12-07 03:47:59 【问题描述】:

当我打开一个模块时,我需要打开一个对话窗口。 在我的模块中,我注册了WindowA,我想在模块的方法OnInitialize() 中显示它。看起来像这样。

public class TestModule : IModule

    IDialogWindow _dialogWindow;

    public TestModule(IContainerProvider containerProvider, IDialogWindow dialogWindow)
    
        _dialogWindow = dialogWindow;
    

    public void OnInitialized(IContainerProvider containerProvider)
    
        _dialogWindow.Show();
    

    public void RegisterTypes(IContainerRegistry containerRegistry)
    
        containerRegistry.RegisterDialog<WindowA>();
    

我的窗口

<Window x:Class="FirstModule.Views.WindowAView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:prism="http://prismlibrary.com/"
        xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
        prism:ViewModelLocator.AutoWireViewModel="True"
        xmlns:local="clr-namespace:FirstModule.Views"
        mc:Ignorable="d"
        Title="WindowA" Height="450" Width="800">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Button Content="Button"/>
    </Grid>
</Window>

并为此查看模型

class WindowAViewModel : IDialogAware

    public WindowAViewModel()
    

    

    public string Title  get; 

    public event Action<IDialogResult> RequestClose;

    public bool CanCloseDialog()
    
        return true;
    

    public void OnDialogClosed()
    
       
    

    public void OnDialogOpened(IDialogParameters parameters)
    
       
    

我也实现了IDialogWindow

公共部分类 WindowAView : Window, IDialogWindow

public WindowAView()

    InitializeComponent();


public IDialogResult Result  get; set; 

但不是WindowAView 而是显示一个小窗口,其中WidthHeight 等于0。

你能解释一下我做错了什么吗?

【问题讨论】:

【参考方案1】:

我认为您误解了文档中的对话服务:

您的对话框视图是一个简单的UserControl,您可以随意设计。唯一要求它有一个实现 IDialogAware 的 ViewModel 设置为 DataContext

对话框视图是一个UserControl,显示在对话框主机中。 Prism 使用标准 WPF 窗口作为默认对话框宿主,但您可以通过实现 IDialogWindow 接口并注册它来创建自己的窗口。在 Prism 7 中,所有人只有一个对话主机。从 Prism 8 开始,您可以根据需要对所有对话框视图或不同的对话框主机使用相同的对话框主机。

使用第三方控件供应商(例如 Infragistics)是很常见的。在这些情况下,您可能希望将承载对话框的标准 WPF Window 控件替换为自定义 Window 类,例如 Infragistics XamRibbonWindow 控件。 在这种情况下,只需创建您的自定义窗口,并实现IDialogWindow 接口:[...] 然后使用IContainerRegistry 注册您的对话窗口。 [...] 如果您想将多个对话窗口用作对话主机,您可以通过指定窗口名称来向容器注册多个对话窗口。

您将IDialogWindow 注入到模块构造函数中,这不是您的WindowAView,而只是默认的对话框主机窗口,它是空的,因为没有要托管的内容。您应该做的是将您的视图定义为 UserControl 并相应地调整您的 WindowAViewModel

<UserControl x:Class="FirstModule.Views.AView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:prism="http://prismlibrary.com/"
             xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
             prism:ViewModelLocator.AutoWireViewModel="True"
             xmlns:local="clr-namespace:FirstModule.Views"
             mc:Ignorable="d"
             Height="450"
             Width="800">
   <Grid>
      <Grid.ColumnDefinitions>
         <ColumnDefinition></ColumnDefinition>
      </Grid.ColumnDefinitions>
      <Button Content="Button"/>
   </Grid>
</UserControl>
public partial class AView : UserControl

   public AView()
   
      InitializeComponent();
   

class AViewModel : IDialogAware

    public AViewModel()
    
    

    public string Title  get; 

    public event Action<IDialogResult> RequestClose;

    public bool CanCloseDialog()
    
        return true;
    

    public void OnDialogClosed()
    
    

    public void OnDialogOpened(IDialogParameters parameters)
    
    

然后注册对话框并使用IDialogService 而不是IDialogWindow

public class TestModule : IModule

    IDialogService _dialogService;

    public TestModule(IContainerProvider containerProvider, IDialogService dialogService)
    
        _dialogService  = dialogService;
    

    public void OnInitialized(IContainerProvider containerProvider)
    
        dialogService.Show(nameof(AView), new DialogParameters(), result => );
    

    public void RegisterTypes(IContainerRegistry containerRegistry)
    
        containerRegistry.RegisterDialog<AView>();
    

这将在默认对话框窗口中显示您的视图,但如上所述,如果需要,您可以随时滚动自己的视图。如需更多信息,请参阅dialog service documentation。

【讨论】:

以上是关于Prism 中的 DialogWindow 不显示我的窗口的主要内容,如果未能解决你的问题,请参考以下文章

WPF - Prism 7.1 - 导航 - 掌握选项卡控件 - 模态/对话框窗口

prism图怎么显示数据

前端代码高亮显示解决方案: prism

前端代码高亮显示解决方案: prism

如何在Prism框架中的模块之间正确发送事件消息?

导航到 PRISM 中的新视图时如何传递对象?