2017-04-09 5 views
0

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

원치 않는 행동을하지 않고 올바르게 영역을 표시하기 위해 가장 좋은 방법은 무엇입니까?

+0

첫 번째 접근 방식에는 어떤 문제가 있습니까? 대화 상자가 닫히고 다시 열릴 때보기가 다시 생성되지 않을 것으로 예상합니까? – mm8

+0

@ mm8 뷰 생성자는 사용자가 뷰를 열 때마다 여러 번 호출되며 창을 닫았다가 다시 열 때마다 생성자가 호출되는 횟수가 늘어납니다. 처음에 뷰 생성자가 뷰를 생성 할 때 한 번 호출되면 두 번째로 3 번처럼 호출됩니다. 세 번째는 더 많이 호출됩니다. ** 대화 상자 창이 아니라 여러 번 호출되는 tabItem 내부의 뷰 ** – IBRA

+0

대화 상자에서 사용 된 뷰 또는 뷰 모델에서 이벤트를 구독하거나 구독 취소하지 않은 애플리케이션 명령을 등록하거나 대화 상자가 닫힐 때 등록 해제 하시겠습니까? 비슷한 행동을 일으킬 수 있습니다. –

답변

1

첫 번째 방법 : RegisterViewWithRegion은 응용 프로그램의 수명 동안 유지되는 전역 등록입니다. 등록을하려면 지역 존재 여부를 확인할 필요가 없습니다. 여러 번 등록하지 않으면 관찰하는 행동을하게됩니다.

보기 생성자에서 등록을 이동하여 한 번만 수행되도록합니다.

영역 존재 여부 확인을 제거하십시오.

보기를 닫으면 시각적 트리에서 제거되고 특정 영역 비헤이비어가 영역 관리자에서 영역을 제거하기 때문에 영역 존재 확인에 실패하고 등록이 여러 번 수행됩니다.