2017-04-09 127 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是一個全局註冊,它將在應用程序的整個生命週期中生存。要進行註冊,您不需要檢查區域是否存在。您不應多次註冊,這會導致您觀察到的行爲。

將註冊移出視圖構造函數,以便它們只被創建一次。

取消區域存在檢查。

您的地區存在檢查失敗並且註冊被執行多次,因爲當視圖關閉時,它會從可視化樹中刪除,特殊區域行爲會從區域管理器中刪除區域。