WPF - Prism:在对话框中显示区域 window
WPF - Prism : Show regions in dialog window
我的对话框 Window 有一个 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
。这正确显示了区域,但是视图在第一次打开对话框时被调用一次 window,并且在关闭 window 并重新打开它之后,视图构造函数被调用了很多次每次用户打开对话框 window.
编辑:多次调用的是 tabItem 内的视图,而不是对话框 window。
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
,这会正确显示区域,但是在关闭并重新查看视图后,所有区域都会消失。 window将所有选项卡都为空。
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);
正确显示区域而不出现任何不良行为的最佳方法是什么?
您的第一种方法:RegisterViewWithRegion 是一个全局注册,将在应用程序的生命周期内有效。要进行注册,您无需检查区域是否存在。您不应该多次注册,这将导致您观察到的行为。
将注册从视图构造函数中移出,以便它们只生成一次。
取消区域是否存在的检查。
您对区域存在性的检查失败并执行了多次注册,因为当视图关闭时,它会从可视化树中删除,并且特殊的区域行为会从区域管理器中删除区域。
我的对话框 Window 有一个 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
。这正确显示了区域,但是视图在第一次打开对话框时被调用一次 window,并且在关闭 window 并重新打开它之后,视图构造函数被调用了很多次每次用户打开对话框 window.
编辑:多次调用的是 tabItem 内的视图,而不是对话框 window。
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
,这会正确显示区域,但是在关闭并重新查看视图后,所有区域都会消失。 window将所有选项卡都为空。
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);
正确显示区域而不出现任何不良行为的最佳方法是什么?
您的第一种方法:RegisterViewWithRegion 是一个全局注册,将在应用程序的生命周期内有效。要进行注册,您无需检查区域是否存在。您不应该多次注册,这将导致您观察到的行为。
将注册从视图构造函数中移出,以便它们只生成一次。
取消区域是否存在的检查。
您对区域存在性的检查失败并执行了多次注册,因为当视图关闭时,它会从可视化树中删除,并且特殊的区域行为会从区域管理器中删除区域。