【发布时间】:2017-04-09 09:33:31
【问题描述】:
我有一个带有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,它正确显示了区域,但在关闭并重新打开视图后,所有区域都消失了。窗口将所有选项卡都为空。
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);
为了正确显示区域而没有任何不良行为的最佳方法是什么?
【问题讨论】:
-
第一种方法有什么问题?您是否希望关闭并重新打开对话框时不会重新创建视图?
-
@mm8 每次用户打开视图时都会多次调用视图构造函数,并且每次关闭并重新打开窗口时调用构造函数的次数都会增加。第一次视图构造函数在创建视图时被调用一次,第二次它被调用 3 次。第三次被叫得更多。 多次调用的是 tabItem 内的视图,而不是对话窗口。
-
在对话框中使用的视图或视图模型中,您是订阅了事件,还是注册了您在对话框关闭时未取消订阅或取消注册的应用程序命令?这可能会导致类似的行为。