c# - 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
等于Height
0。
你能解释一下我做错了什么吗?
解决方案
我认为您从文档中误解了对话服务:
您的对话框视图很简单
UserControl
,可以随心所欲地设计。唯一的要求是它有一个 ViewModel 实现IDialogAware
set as it'sDataContext
。
对话视图是UserControl
显示在对话主机中的。IDialogWindow
Prism 使用标准 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>();
}
}
这将在默认对话框窗口中显示您的视图,但如上所述,如果需要,您可以随时滚动自己的视图。有关详细信息,请参阅对话服务文档。
推荐阅读
- java - 从 OOP 开始 - 骰子游戏问题
- .net - 如何使用 Autofac 配置从插件程序集中加载 ASP.NET Core 控制器?
- r - 将平均值抓取到新数据帧中的循环函数返回子集错误
- r - drop_na( ) 不能在 POSIX-lt 对象上工作
- javascript - createRecord 正在创建一个空记录
- javascript - 在 Android Studio 中编译 React Native 时出错
- ssl - 带非 TLS 后端的 HTTPS 负载平衡器和带 TLS 后端的 HTTPS 负载平衡器有什么区别
- javascript - 我的 wordpress 代码中是否有任何 jquery 冲突?
- python-3.x - 对python中的return语句感到困惑
- laravel - 这意味着未定义的索引:Laravel 中的 team_id