2010-01-17 95 views
4

我有一些看起來應該是很簡單的,但事實上已經證明是十分棘手的問題。WPF UI持久性的TabControl

比方說你有必然的ViewModels的的ItemSource一個TabControl,並使用一個DataTemplate的項目顯示。現在讓我們說DataTemplate包含一個帶兩列的Grid和一個Grid分隔符來調整列的大小。

的問題是,如果你調整一個選項卡上的列,並切換到另一個選項卡中,列也調整。這是因爲TabControl在所有選項卡中共享DataTemplate。這種UI持久性的缺乏被應用於模板的所有元素,這可以在調整各種UI組件時產生令人沮喪的體驗。另一個例子是DataGrid中的滾動位置(在選項卡上)。如果包含更多行的DataGrid滾動到另一個選項卡的底部,則包含少量項目的DataGrid將滾動到視圖外(只有一行可見)。最重要的是,如果TabControl在多個DataTemplates中定義了各種項目,則在不同類型的項目之間切換時會重置視圖。我可以理解,這種方法節省了資源,但最終的功能似乎與預期的UI行爲非常矛盾。

,所以我不知道是否有一個解決方案/解決方法,這是我敢肯定,這是其他人已經遇到過的東西。我在其他論壇上發現了一些類似的問題,但沒有真正的解決方案。一個關於使用AdornerDecorator,但是在與DataTemplate一起使用時似乎不起作用。我並不熱衷於將所有UI屬性(如列寬,滾動位置)綁定到我的ViewModels,事實上我嘗試了這個簡單的GridSplitter示例,但我沒有設法使其工作。 ColumnDefinitions的寬度不一定受網格分割器的影響。無論如何,如果有一個通用的解決方案,這將是很好的。有什麼想法嗎?

如果我溝TabControl的,並使用一個ItemsControl將我遇到類似的問題?是否可以修改TabControl樣式,以便它不共享標籤之間的ContentPresenter?

回答

1

我一直在搞亂這個和關閉了很長一段時間。最後,我沒有試圖修復/修改TabControl,而是簡單地重新創建了它的功能。它實際上運作得非常好。我在列表框(Tab標題)和ItemsControl之外做了Tab'like'Control。關鍵是將ItemsControl的ItemsPanelTemplate設置爲網格。一些樣式,和一個DataTrigger來管理項目的可見性和視覺。它是完美的,每個「Tab」是一個獨特的對象,並保留所有的UI狀態,如滾動位置,選擇,列寬等。這種類型的解決方案可能會出現什麼缺點或問題?

 <DockPanel> 
      <ListBox 
       DockPanel.Dock="Top" 
       ItemsSource="{Binding Tabs}" 
       SelectedItem="{Binding SelectedTab}" 
       ItemContainerStyle="{StaticResource ImitateTabControlStyle}"> 
       <ListBox.ItemsPanel> 
        <ItemsPanelTemplate> 
         <StackPanel 
          Orientation="Horizontal"> 
         </StackPanel> 
        </ItemsPanelTemplate> 
       </ListBox.ItemsPanel> 

       <ListBox.ItemTemplate> 
        <DataTemplate>        
         <StackPanel 
          Margin="2,2,2,0" 
          Orientation="Horizontal" > 
          <TextBlock 
           Margin="4,0" FontWeight="Bold" 
           Padding="2" 
           VerticalAlignment="Center" HorizontalAlignment="Left" 
           Text="{Binding Name}" > 
          </TextBlock> 
          <Button 
           Margin="4,0" 
           Command="{Binding CloseCommand}"> 
           <Image Source="/TERM;component/Images/Symbol-Delete.png" MaxHeight="20"/> 
          </Button> 
         </StackPanel>        
        </DataTemplate> 
       </ListBox.ItemTemplate> 
      </ListBox> 
      <ItemsControl  
       ItemsSource="{Binding Tabs}"> 
       <ItemsControl.ItemsPanel> 
        <ItemsPanelTemplate> 
         <Grid /> 
        </ItemsPanelTemplate> 
       </ItemsControl.ItemsPanel> 
       <ItemsControl.ItemTemplate> 
        <DataTemplate> 
         <ContentControl         
          Content="{Binding}"> 
          <ContentControl.Style> 
           <Style> 
            <Style.Triggers> 
             <DataTrigger 
              Binding="{Binding IsSelected}" Value="False"> 
              <Setter Property="ContentControl.Visibility" Value="Hidden" />             
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </ContentControl.Style> 
         </ContentControl> 
        </DataTemplate> 
       </ItemsControl.ItemTemplate> 
      </ItemsControl>     
     </DockPanel> 
+0

您能否提供用於測試它的「ImitateTabControlStyle」資源。這聽起來不錯 – 2010-03-26 06:47:12