首页 > 解决方案 > Prism 中的 DialogWindow 不显示我的窗口

问题描述

当我打开一个模块时,我需要打开一个对话窗口。在我的模块中我注册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 :窗口,IDialogWindow {

public WindowAView()
{
    InitializeComponent();
}

public IDialogResult Result { get; set; }

}

但不是WindowAView一个小窗口,而是显示Width等于Height0。

主窗口前面的一个小对话框窗口,仅显示具有最小宽度的标题栏。

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

标签: c#wpfxamlprism

解决方案


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

您的对话框视图很简单UserControl,可以随心所欲地设计。唯一的要求是它有一个 ViewModel 实现IDialogAwareset as it's DataContext

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

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

您将 注入IDialogWindow到模块构造函数中,这不是您的WindowAView,而只是默认的对话框主机窗口,它是空的,因为没有要托管的内容。相反,您应该做的是将您的视图定义为 aUserControl并相应地调整您的视图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>();
    }
}

这将在默认对话框窗口中显示您的视图,但如上所述,如果需要,您可以随时滚动自己的视图。有关详细信息,请参阅对话服务文档


推荐阅读