說我有一個選項卡控件,並且我有超過50個選項卡,其中沒有足夠的空間容納如此多的選項卡,如何使這些選項卡可滾動?想爲tabcontrol製作可滾動的選項卡
回答
重寫TabControl
ControlTemplate
並添加ScrollViewer
的TabPanel
圍繞這樣的例子:
<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>
這給出了這樣的結果:
什麼是你的'TabPanel'的'Grid.Column'和'Grid.Row'在做什麼?這個'TabPanel'不是直接包含在任何'Grid'中。此外,需要在ContentPresenter附近添加一個額外的'Border',以使'TabControl'看起來像普通的'TabControl',否則。除此之外,感謝您的基本演示:-) – 2014-02-02 23:00:07
如何使scrollviewer滾動到選定的選項卡項目? – Coder14 2016-05-09 13:21:11
@Lander在那裏看到我的回答 – 2017-01-06 14:08:06
把它放在裏面。
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Hidden">
<TabControl ...>
...
</TabControl>
</ScrollViewer>
而不是滾動整個tabcontrol,我只需要滾動tabItems ...例如,應該在tabItems的左/右邊緣上有左/右箭頭按鈕,以便用戶可以水平滾動它們。我應該重寫TabControl的風格嗎? – demaxSH 2011-04-17 00:54:29
裏克的回答居然打破了縱向拉伸的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>
事實上,在某些情況下,接受的答案不僅僅是垂直拉伸,特別是在使用外部UI庫時。這是解決方案。 – 2016-05-28 17:48:08
最近我實現了這樣的控制。它包含兩個按鈕(左右滾動),在需要時將其狀態切換爲IsEnabled
和Visibility
。它也適用於項目選擇:如果您選擇一個半可見項目,它將滾動顯示它完全。
它看起來如此:
這與其說是從默認的控制不同,滾動自動出現:
<tab:ScrollableTabControl ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
IsAddItemEnabled="False"
.../>
我寫這個文章ScrollableTabControl
類in my blog here。
的源代碼,你可以在這裏找到:WpfScrollableTabControl.zip
這是一個非常好的控制 - 簡單而實用(我已經成功地將您的功能包含在另一個自定義控件中)。感謝分享! – Bartosz 2015-04-14 10:29:33
爲什麼不把它的源代碼放在github上? – TKharaishvili 2016-09-09 00:43:54
上述解決方案非常適合與標籤控件的「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屬性,以使其默認爲右側。
對於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);
}
}
- 1. TabControl - 在選項卡之間滾動
- 2. 複製的TabControl選項卡
- 3. 從TabControl C#Winform中滾動選項卡停止箭頭鍵
- 4. MVVM Tabcontrol更改選項卡
- 5. WPF TabControl選項卡「跳躍」
- 6. ActionBar選項卡 - 固定和可滾動?
- 7. 控制按鈕的可見性取決於AjaxToolKit上的活動選項卡:TabControl
- 8. 可滾動選項卡視圖中的動態選項卡反應原生
- 9. WPF Tabcontrol:對選項卡項目選擇滑動效果
- 10. MVVM從TabControl中選擇新選項卡
- 11. Android可滾動選項卡+滑動時刷卡狀態
- 12. WPF TabControl的重新排序選項卡
- 13. TabControl中的縮進選項卡
- 14. bootstrap選項卡作爲移動設備的選項卡
- 15. 製表可移動自定義的Tabcontrol - 獲取選定的選項卡的項目寬度
- 16. 帶自動滾動選項卡的JTabbedPane
- 17. C#切換選項卡(tabcontrol),同時拖動並懸停在選項卡上
- 18. 從TabItem到TabControl的TabControl中的WPF選項卡
- 19. 製作TabControl動畫
- 20. 如何製作可選的滾動條?
- 21. 我想讓我的選項卡滾動,但在使用FragmentTabHost時不起作用
- 22. 將新選項卡添加到TabControl
- 23. TabControl選項卡按鈕位置
- 24. C#:按名稱添加TabControl選項卡
- 25. 從模板添加選項卡到TabControl
- 26. 關聯tabcontrol選項卡與字符串
- 27. 所有者繪製tabcontrol有更寬的選項卡
- 28. 在tabcontrol(winforms)的單個選項卡上設置可見性
- 29. TabControl中的Silverlight 4可關閉選項卡
- 30. SSMS消息選項卡自動滾動
50個製表符......? – BoltClock 2011-04-17 00:23:28