2011-04-17 92 views

回答

17

重寫TabControlControlTemplate並添加ScrollViewerTabPanel圍繞這樣的例子:

<Grid> 
    <TabControl> 
     <TabControl.Template> 
      <ControlTemplate TargetType="TabControl"> 
       <StackPanel> 
        <ScrollViewer HorizontalScrollBarVisibility="Visible" VerticalScrollBarVisibility="Disabled"> 
         <TabPanel x:Name="HeaderPanel" 
           Panel.ZIndex ="1" 
           KeyboardNavigation.TabIndex="1" 
           Grid.Column="0" 
           Grid.Row="0" 
           Margin="2,2,2,0" 
           IsItemsHost="true"/> 
        </ScrollViewer> 
        <ContentPresenter x:Name="PART_SelectedContentHost" 
              SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
              Margin="{TemplateBinding Padding}" 
              ContentSource="SelectedContent"/> 
       </StackPanel> 
      </ControlTemplate> 
     </TabControl.Template> 
     <TabItem Header="TabItem1">TabItem1 Content</TabItem> 
     <TabItem Header="TabItem2">TabItem2 Content</TabItem> 
     <TabItem Header="TabItem3">TabItem3 Content</TabItem> 
     <TabItem Header="TabItem4">TabItem4 Content</TabItem> 
     <TabItem Header="TabItem5">TabItem5 Content</TabItem> 
     <TabItem Header="TabItem6">TabItem6 Content</TabItem> 
     <TabItem Header="TabItem7">TabItem7 Content</TabItem> 
     <TabItem Header="TabItem8">TabItem8 Content</TabItem> 
     <TabItem Header="TabItem9">TabItem9 Content</TabItem> 
     <TabItem Header="TabItem10">TabItem10 Content</TabItem> 
    </TabControl> 
</Grid> 

這給出了這樣的結果:

TabControlScroll

+0

什麼是你的'TabPanel'的'Grid.Column'和'Grid.Row'在做什麼?這個'TabPanel'不是直接包含在任何'Grid'中。此外,需要在ContentPresenter附近添加一個額外的'Border',以使'TabControl'看起來像普通的'TabControl',否則。除此之外,感謝您的基本演示:-) – 2014-02-02 23:00:07

+1

如何使scrollviewer滾動到選定的選項卡項目? – Coder14 2016-05-09 13:21:11

+0

@Lander在那裏看到我的回答 – 2017-01-06 14:08:06

2

把它放在裏面。

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden"> 
    <TabControl ...> 
     ... 
    </TabControl> 

</ScrollViewer> 
+0

而不是滾動整個tabcontrol,我只需要滾動tabItems ...例如,應該在tabItems的左/右邊緣上有左/右箭頭按鈕,以便用戶可以水平滾動它們。我應該重寫TabControl的風格嗎? – demaxSH 2011-04-17 00:54:29

21

裏克的回答居然打破了縱向拉伸的tabcontrol內的內容。可以通過使用兩行柵格而不是StackPanel來改進保留垂直拉伸。

<TabControl.Template> 
      <ControlTemplate TargetType="TabControl"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden" > 
         <TabPanel x:Name="HeaderPanel" 
          Panel.ZIndex ="1" 
          KeyboardNavigation.TabIndex="1" 
          Grid.Column="0" 
          Grid.Row="0" 
          Margin="2,2,2,0" 
          IsItemsHost="true"/> 
        </ScrollViewer> 
        <ContentPresenter x:Name="PART_SelectedContentHost" 
             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
             Margin="{TemplateBinding Padding}" 
             ContentSource="SelectedContent" Grid.Row="1"/> 
       </Grid> 
      </ControlTemplate> 
     </TabControl.Template> 
+1

事實上,在某些情況下,接受的答案不僅僅是垂直拉伸,特別是在使用外部UI庫時。這是解決方案。 – 2016-05-28 17:48:08

14

最近我實現了這樣的控制。它包含兩個按鈕(左右滾動),在需要時將其狀態切換爲IsEnabledVisibility。它也適用於項目選擇:如果您選擇一個半可見項目,它將滾動顯示它完全。

它看起來如此:

WPF Scrollable TabControl

這與其說是從默認的控制不同,滾動自動出現:

<tab:ScrollableTabControl ItemsSource="{Binding Items}" 
    SelectedItem="{Binding SelectedItem, Mode=TwoWay}" 
    IsAddItemEnabled="False" 
    .../> 

我寫這個文章ScrollableTabControlin my blog here

的源代碼,你可以在這裏找到:WpfScrollableTabControl.zip

+0

這是一個非常好的控制 - 簡單而實用(我已經成功地將您的功能包含在另一個自定義控件中)。感謝分享! – Bartosz 2015-04-14 10:29:33

+1

爲什麼不把它的源代碼放在github上? – TKharaishvili 2016-09-09 00:43:54

7

上述解決方案非常適合與標籤控件的「TabStripPlacement」屬性設置爲「top」標籤的項目。但是,如果你正在尋找有你的標籤項目,說到左側,那麼你將需要改變一些東西。

這裏是如何得到的ScrollViewer與TabStripPlacement到左邊工作樣本:

<TabControl.Template> 
<ControlTemplate TargetType="TabControl"> 
    <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="Auto"/> 
      <ColumnDefinition /> 
     </Grid.ColumnDefinitions> 
     <ScrollViewer 
      HorizontalScrollBarVisibility="Disabled" 
      VerticalScrollBarVisibility="Auto" 
      FlowDirection="RightToLeft"> 
       <TabPanel 
        x:Name="HeaderPanel" 
        Panel.ZIndex ="0" 
        KeyboardNavigation.TabIndex="1" 
        IsItemsHost="true" 
       /> 
     </ScrollViewer> 
     <ContentPresenter 
      x:Name="PART_SelectedContentHost" 
      SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
      ContentSource="SelectedContent" Grid.Column="1" 
     /> 
    </Grid> 
</ControlTemplate> 

注意的是,在ScrollViewer中我設置的FlowDirection =「從右至左」這樣滾動酒吧會捕捉到標籤項目的左側。如果您要將選項卡項目放在右側,則需要刪除FlowDirection屬性,以使其默認爲右側。

這裏是結果: enter image description here

+0

看來你也改變了TabItem風格,對吧? – Felix 2017-09-04 09:00:30

+0

我在示例圖片中包含了我的一個應用程序,但您不必爲了讓選項卡項目在左側排列並滾動。 – 2017-09-06 22:34:50

+1

做得很好,對我的項目來說效果很好 – EdwardM 2018-02-19 22:22:33

0

對於thoose誰想要知道如何使ScrollViewer中滾動到所選標籤項目

將此事件SelectionChanged =「TabControl_SelectionChanged」添加到您的TabControl。

然後爲模板中的ScrollViewer添加一個名稱,如TabControlScroller。您應該然後,在代碼是這樣的

<TabControl SelectionChanged="TabControl_SelectionChanged"> 
     <TabControl.Template> 
      <ControlTemplate TargetType="TabControl"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto" /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 
        <ScrollViewer x:Name="TabControlScroller" HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden" > 
         <TabPanel x:Name="HeaderPanel" 
          Panel.ZIndex ="1" 
          KeyboardNavigation.TabIndex="1" 
          Grid.Column="0" 
          Grid.Row="0" 
          Margin="2,2,2,0" 
          IsItemsHost="true"/> 
        </ScrollViewer> 
        <ContentPresenter x:Name="PART_SelectedContentHost" 
         SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
         Margin="{TemplateBinding Padding}" 
         ContentSource="SelectedContent" Grid.Row="1"/> 
       </Grid> 
      </ControlTemplate> 
     </TabControl.Template> 
    <!-- Your Tabitems--> 
</TabControl> 

結束後面,你只需要添加這個方法:

private void TabControl_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) 
{ 
    TabControl tabControl = (TabControl)sender; 
    ScrollViewer scroller = (ScrollViewer)tabControl.Template.FindName("TabControlScroller", tabControl); 
    if (scroller != null) 
    { 
     double index = (double)(tabControl.SelectedIndex); 
     double offset = index * (scroller.ScrollableWidth/(double)(tabControl.Items.Count)); 
     scroller.ScrollToHorizontalOffset(offset); 
    } 
} 
相關問題