當我打開一個模塊時,我需要打開一個對話視窗。在我的模塊中,我注冊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一個小視窗被示出具有Width和Height等于0。

你能解釋一下我做錯了什么嗎?
uj5u.com熱心網友回復:
我認為您從檔案中誤解了對話服務:
您的對話視圖很簡單
UserControl,您可以隨意設計。唯一的要求是它有一個實作IDialogAware設定為DataContext.
該對話框視圖是UserControl被示出在一個對話框宿主。Prism 使用標準 WPF 視窗作為默認對話框宿主,但您可以通過實作IDialogWindow介面并注冊它來創建自己的對話框。在 Prism 7 中,所有人都只有一個對話主機。從 Prism 8 開始,您可以根據需要為所有對話視圖或不同的對話主機使用相同的對話主機。
使用第三方控制元件供應商(例如 Infragistics)是很常見的。在這些情況下,您可能希望用自定義 Window 類(例如 Infragistics XamRibbonWindow 控制元件)替換承載對話框的標準 WPF Window 控制元件。在這種情況下,只需創建您的自定義視窗,并實作
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>();
}
}
這將在默認對話框視窗中顯示您的視圖,但如上所述,如果需要,您始終可以滾動自己的視圖。有關更多資訊,請參閱對話服務檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/329715.html
