Home > Enterprise >  DialogWindow in Prism does not show my window
DialogWindow in Prism does not show my window

Time:10-21

I need to open a dialog window when I open a module. In my module I register WindowA and I want to show it in method OnInitialize() of the module. It looks like this.

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>();
    }
}

My window

<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>

and View model for this

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)
    {
       
    }
}

Also I implemented IDialogWindow

public partial class WindowAView : Window, IDialogWindow {

public WindowAView()
{
    InitializeComponent();
}

public IDialogResult Result { get; set; }

}

But instead of WindowAView a small window is shown with Width and Height equal to 0.

A small dialog window in front of the main window that only shows the title bar with minimum width.

Could you please explain what I did wrong?

CodePudding user response:

I think you misunderstood the dialog service, from the documentation:

Your dialog view is a simple UserControl that can be designed anyway you please. The only requirement it has a ViewModel that implements IDialogAware set as it's DataContext.

The dialog view is a UserControl that is shown in a dialog host. Prism uses a standard WPF window as default dialog host, but you can create your own by implementing the IDialogWindow interface and registering it. In Prism 7, there was only one dialog host for all. Since Prism 8, you can use the same dialog host for all dialog views or different dialog hosts as you want.

It's very common to be using a third-party control vendor such as Infragistics. In these cases, you may want to replace the standard WPF Window control that hosts the dialogs with a custom Window class such as the Infragistics XamRibbonWindow control. In this case, just create your custom Window, and implement the IDialogWindow interface: [...] Then register your dialog window with the IContainerRegistry. [...] If you have more than one dialog window you would like to use as a dialog host, you register multiple dialog windows with the container by specifying a name for the window.

You inject the IDialogWindow into the module constructor, which is not your WindowAView, but simply the default dialog host window, which is empty, as there is no content to host. What you should do instead is define your view as a UserControl and adapt your WindowAViewModel accordingly.

<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)
    {
    }
}

Then register the dialog and use the IDialogService instead of 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>();
    }
}

This will show your view in the default dialog window, but as stated above, you can always roll your own, if you need to. For more information, see the dialog service documentation.

  • Related