65.9K
CodeProject 正在变化。 阅读更多。
Home

扩展的 WPF TabControl

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (55投票s)

2007 年 10 月 13 日

CPOL

3分钟阅读

viewsIcon

332925

downloadIcon

10983

修改 WPF TabControl 以显示单行滚动的 TabItem

Screenshot - TabControl_Default.jpg

引言

我最近决定尝试修改内置的 WPF TabControl,使其行为类似于 Internet Explorer 7 的工作方式。

我想要更改的主要区域是 TabItems 的排列方式,目前内置的 TabControl 会打包和堆叠项目,所以项目越多,标题所需的空间就越大,从而占用 TabItem 的实际内容空间。

在 Internet Explorer 7 中,标签保持在单行上,并且会滚动进出视图。 这就是我希望此控件的行为方式。

属性/事件

控件中添加了一些额外的属性(依赖属性)和事件。

  • AllowAddNew - 将此属性设置为 true 将允许最终用户通过 button 向控件添加新的 tabitems
  • AllowDelete - 将此属性设置为 true 将允许最终用户通过单击所选 tabitem 上的关闭 button 从控件中删除 tabitems

如果将上述属性设置为 true,则有三个事件与这些属性一起使用。 它们是 TabItemAddedTabItemClosingTabItemClosed:所有这些都提供对要添加/删除的 TabItem 的引用,TabItemClosing 事件提供了一个在需要时取消关闭的位置。

  • AddNewTabToEnd - 如果此属性为 true,则使用 AddNew button 添加的 tabitems 将添加到 tabitems 行的末尾,否则新的 tabitem 将插入到当前选择的 tabitem 之后。
  • SelectNewTabOnCreate - 如果此属性为 true,则焦点将移动到新添加的 tabitem

最后,有三个额外的 Brush 类型的属性,用于根据它们的状态为 tabitems 着色

  • TabItemNormalBackground
  • TabItemMouseOverBackground
  • TabItemSelectedBackground

如果您查看本文顶部的图片,它显示了 TabControl 的默认样式。 我故意使它非常基本。 通过仅使用额外的 Background 属性,您可以轻松更改 TabControl 的外观。 如图所示,通过添加一些 LinearGradientBrushes,您可以获得类似于 Internet Explorer 7 的东西。

TabControl_IE7.jpg

有四个属性在 tabitems 的排列中起着积极作用。 它们是

  • TabItemMinWidth
  • TabItemMaxWidth
  • TabItemMinHeight
  • TabItemMaxHeight

排列 TabItems

tabcontrol 以三种方式排列其 tabitems
如果 TabStripPlacement 属性设置为 TopBottom,则以下描述相关。

  1. 如果 TabItems 的总宽度小于可用的可见空间,那么我们只是将它们一个接一个地排列,考虑到 TabItemMaxWidthTabItemMinWidth 属性。
  2. 如果总宽度大于可见宽度,则计算所有 tabitems 所需的宽度,以便所有都可见。 如果此宽度大于 TabItemMinWidth 属性,则我们使用此计算的宽度排列 tabitems
  3. 一旦我们添加了太多的 tabitems,它们的宽度将小于 TabitemMinWidth 属性,那么将启用滚动。

负责排列 tabitems 的类是 VirtualizingTabPanel。 顾名思义,此面板派生自 VirtualizingPanel 类,并实现了 IScrollInfo 接口。 我不会在此处描述 VirtualizingPanel 是什么,而是将您定向到 Dan Crevier 的这篇 博客文章,其中描述了它是什么以及如何实现一个。

Using the Code

要使用该控件,您需要添加对 Wpf.TabControl 程序集的引用,然后向窗口添加一个 xmlns

xmlns:r="clr-namespace:Wpf.Controls;assembly=Wpf.TabControl" 

提供的演示显示了如何将控件添加到窗口并设置其属性。

历史

  • 2007 年 10 月 13 日:初始上传
  • 2009 年 3 月 9 日:实现了 ItemsSource 绑定和错误修复
  • 2009 年 4 月 5 日:更新源代码
© . All rights reserved.