2017-04-09 63 views
0

我有一个TabControl对话框窗口,其中包含4个选项卡,每个选项卡包含一个区域。WPF - 棱镜:在对话框窗口中显示区域

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

​​

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); 

什么是为了正确显示区,而无需任何不必要的行为,最好的办法?

+0

第一种方法有什么问题?您是否期望在对话框关闭并重新打开时不会重新创建视图? – mm8

+0

@ mm8每次用户打开视图时都会调用视图构造函数多次,并且每次窗口关闭并重新打开时,调用构造函数的次数都会增加。视图构造函数在创建视图时第一次被调用,第二次被调用3次。第三次被称为更多。 **这是tabItem中被多次调用的视图,而不是对话窗口。** – IBRA

+0

在对话框中使用的视图或视图模型中,您是订阅事件还是注册您不取消订阅的应用程序命令,或者注销对话框时取消注册?这可能导致类似的行为。 –

回答

1

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

将注册移出视图构造函数,以便它们只被创建一次。

取消区域存在检查。

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