TabControl
이있는 대화 상자 창이 있습니다. 각 탭에는 4 개의 탭이 있습니다. 각 탭에는 영역이 있습니다.WPF - 프리즘 : 대화 상자 창에 영역 표시
I의 탭 내부의 영역을 표시하기 위해 두 가지 방법을 시도했다
<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>
DialogWindowTestView.xaml. 먼저 RegisterViewWithRegion
을 사용했습니다. 이것은 정확하게 지역을 보여줍니다 하지만 처음에는 대화 상자 창을 열 때보기가 한 번 호출되고 창을 닫은 후 다시 열면 사용자가 대화 상자 창을 열 때마다보기 생성자가 여러 번 호출됩니다.
편집 : 대화 상자 창이 아니라 여러 번 호출되는 tabItem 내부의보기입니다.
DialogWindowTestViewModel.cs 번째 방법은 regionManager.RequestNavigate
이다
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));
}
,이 올바르게 영역을 나타내고 있지만 폐쇄하고 모든 영역이 사라 뷰 재 opining 후. 창에는 모든 탭이 비어 있습니다.
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
@ mm8 뷰 생성자는 사용자가 뷰를 열 때마다 여러 번 호출되며 창을 닫았다가 다시 열 때마다 생성자가 호출되는 횟수가 늘어납니다. 처음에 뷰 생성자가 뷰를 생성 할 때 한 번 호출되면 두 번째로 3 번처럼 호출됩니다. 세 번째는 더 많이 호출됩니다. ** 대화 상자 창이 아니라 여러 번 호출되는 tabItem 내부의 뷰 ** – IBRA
대화 상자에서 사용 된 뷰 또는 뷰 모델에서 이벤트를 구독하거나 구독 취소하지 않은 애플리케이션 명령을 등록하거나 대화 상자가 닫힐 때 등록 해제 하시겠습니까? 비슷한 행동을 일으킬 수 있습니다. –