WPF - 棱镜:在对话框窗口中显示区域

时间:2017-04-09 09:33:32

标签: c# wpf xaml mvvm prism

我有一个带有TabControl的对话窗口,其中包含4个标签,每个标签都包含一个区域。

DialogWindowTestView.xaml

<TabControl DockPanel.Dock="Top" TabStripPlacement="Left">
    <TabItem Header="General">
        <ContentControl regions:RegionManager.RegionName="GeneralRegion" />
    </TabItem>
    <TabItem Header="Materials">
        <ContentControl regions:RegionManager.RegionName="MaterialsRegion" />
    </TabItem>
    <TabItem Header="Design">
        <ContentControl regions:RegionManager.RegionName="DesignRegion" />
    </TabItem>
    <TabItem Header="Units">
        <ContentControl regions:RegionManager.RegionName="UnitsRegion" />
    </TabItem>
</TabControl>

我尝试了两种方法来显示标签内的区域。 首先我使用了RegisterViewWithRegion。这会正确显示区域,但首次打开对话框窗口时会调用一次视图,关闭窗口并重新打开它后,每次用户打开对话框窗口时都会多次调用视图构造函数。 /强>

编辑:这是tabItem中多次调用的视图,而不是对话框窗口。

DialogWindowTestViewModel.cs

if (!regionManager.Regions.ContainsRegionWithName("GeneralRegion")) {
    regionManager.RegisterViewWithRegion("GeneralRegion", typeof(GeneralView));
}
if (!regionManager.Regions.ContainsRegionWithName("MaterialsRegion")) {
    regionManager.RegisterViewWithRegion("MaterialsRegion", typeof(MaterialsView));
}
if (!regionManager.Regions.ContainsRegionWithName("DesignRegion")) {
    regionManager.RegisterViewWithRegion("DesignRegion", typeof(DesignView));
}
if (!regionManager.Regions.ContainsRegionWithName("UnitsRegion")) {
    regionManager.RegisterViewWithRegion("UnitsRegion", typeof(UnitSetView));
}

第二种方法是regionManager.RequestNavigate,这会正确显示区域,但在关闭并重新查看视图后,所有区域都会消失。窗口将显示所有选项卡为空。< / p>

DialogWindowTestView.xaml.cs

RegionManager.SetRegionManager(this, regionManager);
RegionManager.UpdateRegions();

DialogWindowTestViewModel.cs

container.RegisterType<object, GeneralView>(typeof(GeneralView).FullName);
regionManager.RequestNavigate("GeneralRegion", typeof(GeneralView).FullName);

container.RegisterType<object, MaterialsView>(typeof(MaterialsView).FullName);
regionManager.RequestNavigate("MaterialsRegion", typeof(MaterialsView).FullName);

container.RegisterType<object, DesignView>(typeof(DesignView).FullName);
regionManager.RequestNavigate("DesignRegion", typeof(DesignView).FullName);

container.RegisterType<object, UnitSetView>(typeof(UnitSetView).FullName);
regionManager.RequestNavigate("UnitsRegion", typeof(UnitSetView).FullName);

在没有任何不良行为的情况下正确显示区域的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

您的第一种方法:RegisterViewWithRegion是一个全局注册,将在应用程序的生命周期内存在。要进行注册,您无需检查区域是否存在。您不应多次注册,这将导致您观察到的行为。

将注册移出视图构造函数,以便只进行一次。

删除对区域存在的检查。

您对区域存在的检查失败并且多次执行注册,因为当视图关闭时,它将从可视树中删除,特殊区域行为将从区域管理器中删除区域。