目录

介绍

背景

使用代码

自定义

实现

注释


  • 下载演示-29 KB

介绍

对于许多应用程序,希望有一个带有可滚动,重新排列和关闭的选项卡项的选项卡控件。幸运的是,使用标准WPF组件来实现此目标并不难。

本文介绍了一个选项卡页眉控件,其中包含可使用左右箭头按钮滚动并使用简单的拖动操作重新排列的项目。我决定创建一个选项卡页眉控件,而不是一个完整的选项卡控件,以允许更大程度的自定义。将选项卡页眉控件与其他WPF控件组合在一起以创建完整的选项卡控件非常容易。

选项卡页眉控件包括许多依赖项属性,以允许自定义,例如,用于选定和未选定选项卡背景的画笔。

该示例代码包括以下演示应用程序:

顶部选项卡控件包含四个选项卡项。选项卡页眉的每一侧都有左右滚动按钮。默认情况下,滚动按钮绘制为简单的绿色三角形。最右边是显示弹出菜单的按钮,允许用户选择以下选项卡项之一:

中间的标签控件具有标签内容窗格下面的标签,以及滚动按钮的自定义模板。

底部的标签控件具有标签内容窗格上方的标签,以及每个标签项的自定义模板。

主窗口底部的控件允许用户配置字体,标签边框和背景颜色。请注意,该设置不适用于第三个选项卡控件,因为它使用了自定义项目容器样式。

每个选项卡控件的一个关键功能是能够通过将选项卡项拖动到新位置来重新排列它们。

背景

您将需要对C#和Windows开发有充分的了解,并需要WPF的基础知识。

使用代码

在XAML中,第一个标签控件由标签页眉控件、按钮和简单标签构成,以显示当前标签项目的内容。选项卡标题控件的定义如下:

<wpfcontrollibrary:TabHeaderControl Grid.Row="1" Grid.Column="0"
x:Name="_tabHeader1" ItemsSource="{Binding ListBoxItems}"
SelectedItem="{Binding SelectedHeader, Mode=TwoWay}"><wpfcontrollibrary:TabHeaderControl.DisplayMemberPath>HeaderText</wpfcontrollibrary:TabHeaderControl.DisplayMemberPath><wpfcontrollibrary:TabHeaderControl.SelectedTabBackground><Binding Path="SelectedTabBackground" Mode="TwoWay"/></wpfcontrollibrary:TabHeaderControl.SelectedTabBackground><wpfcontrollibrary:TabHeaderControl.UnselectedTabBackground><Binding Path="UnselectedTabBackground" Mode="TwoWay"/></wpfcontrollibrary:TabHeaderControl.UnselectedTabBackground><wpfcontrollibrary:TabHeaderControl.SelectedTabBorderThickness><Binding Path="SelectedTabBorderThickness_Top"/></wpfcontrollibrary:TabHeaderControl.SelectedTabBorderThickness><wpfcontrollibrary:TabHeaderControl.SelectedTabForeground>Black</wpfcontrollibrary:TabHeaderControl.SelectedTabForeground><wpfcontrollibrary:TabHeaderControl.UnselectedTabForeground>White</wpfcontrollibrary:TabHeaderControl.UnselectedTabForeground><wpfcontrollibrary:TabHeaderControl.FontSize><Binding Path="FontSize"/></wpfcontrollibrary:TabHeaderControl.FontSize><wpfcontrollibrary:TabHeaderControl.FontFamily><Binding Path="FontFamily"/></wpfcontrollibrary:TabHeaderControl.FontFamily><wpfcontrollibrary:TabHeaderControl.DisabledArrowBrush>Transparent</wpfcontrollibrary:TabHeaderControl.DisabledArrowBrush>
</wpfcontrollibrary:TabHeaderControl>

以上大部分内容都是自我解释。通过TabHeaderItem向ItemsSource属性分配实例的可观察集合来填充选项卡列表。所述TabHeaderItem类的定义如下:

class TabHeaderItem
{public string Label { get; set; }public int ID { get; set; }public string HeaderText{get{return Label + " : " + ID;}}
}

DisplayMemberPath属性的行为方式与ListBox的DisplayMemberPath属性完全相同。它设置为“HeaderText”,因此每个选项卡都显示由关联TabHeaderItem实例的HeaderText属性返回的文本。

有许多属性可控制选项卡项的外观。因此,UnselectedTabBackground属性为未选择的选项卡定义背景画笔。

第二个选项卡控件类似,除了选项卡标题项在选项卡内容下方,并且滚动按钮已重新设置样式。

第三个选项卡控件最有趣,因为它覆盖TabHeaderControl的ItemContainerStyle属性。这样可以完全自定义标签的外观和功能。在这种情况下,大多数属性如UnselectedTabBackground都不会使用。该示例定义了一个带有文本字符串和关闭按钮的选项卡项,其中关闭功能在后面的代码中实现。ItemContainerStyle属性定义如下:

<wpfcontrollibrary:TabHeaderControl Grid.Row="7" Grid.Column="0" x:Name="_tabHeader3" ItemsSource="{Binding ListBoxItems}" SelectedItem="{Binding SelectedHeader, Mode=TwoWay}"><wpfcontrollibrary:TabHeaderControl.ItemContainerStyle><Style TargetType="ListBoxItem"><Setter Property="FrameworkElement.Margin" Value="0"/><Setter Property="FocusVisualStyle" Value="{x:Null}" /><Setter Property="Padding" Value="0" /><Setter Property="Margin" Value="0" /><EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBoxItem_PreviewMouseLeftButtonDown" /><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="ListBoxItem"><Border Background="{TemplateBinding Background}" Padding="4" SnapsToDevicePixels="true" BorderThickness="0" CornerRadius="20,10,0,0"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="4"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="2"/><ColumnDefinition Width="Auto"/><ColumnDefinition Width="2"/></Grid.ColumnDefinitions><Label Grid.Column="1" FontSize="14" Foreground="{TemplateBinding Foreground}" Background="{TemplateBinding Background}" Width="Auto" Padding="2,0,2,0" Margin="0" VerticalAlignment="Center"><TextBlock><Run Text="{Binding Label}"/><Run Text=" ("/><Run Text="{Binding ID}"/><Run Text=")"/></TextBlock></Label><Button Grid.Column="3" Width="20" Height="20" Content="X" FontSize="12" Background="{TemplateBinding Background}" Foreground="{TemplateBinding Foreground}" BorderThickness="0" Click="Button_Click"/></Grid></Border></ControlTemplate></Setter.Value></Setter><Style.Triggers><Trigger Property="IsSelected" Value="True"><Setter Property="Background" Value="Orange"/><Setter Property="Foreground" Value="Black"/></Trigger><Trigger Property="IsSelected" Value="False"><Setter Property="Background" Value="DarkSlateBlue"/><Setter Property="Foreground" Value="White"/></Trigger></Style.Triggers></Style></wpfcontrollibrary:TabHeaderControl.ItemContainerStyle><wpfcontrollibrary:TabHeaderControl.FontFamily><Binding Path="FontFamily"/></wpfcontrollibrary:TabHeaderControl.FontFamily>
</wpfcontrollibrary:TabHeaderControl>

触发器用于选择和未选择时设置选项卡的样式。

需要注意的有趣一点是数据模板的以下摘录:

<EventSetter Event="PreviewMouseLeftButtonDown" Handler="ListBoxItem_PreviewMouseLeftButtonDown" />

ListBoxItem_PreviewMouseLeftButtonDown处理程序的按钮单击事件之前调用。sender参数是ListBoxItem允许后面的代码确定与后续按钮按下关联的选项卡项目的索引。处理程序代码如下:

private void ListBoxItem_PreviewMouseLeftButtonDown
(object sender, System.Windows.Input.MouseButtonEventArgs e)
{System.Windows.Controls.ListBoxItem listBoxItem = sender as System.Windows.Controls.ListBoxItem;if (listBoxItem == null){return;}TabHeaderItem tabHeaderItem = listBoxItem.DataContext as TabHeaderItem;if (tabHeaderItem == null){return;}_listBoxItemIndex = (DataContext as MainWindowModel).ListBoxItems.IndexOf(tabHeaderItem);
}

因此,_listBoxItemIndex值定义了与随后的关闭按钮单击事件关联的列表框项目的索引。

自定义

可以使用以下依赖项属性来修改控件的外观和行为:

ItemsSource

获取或设置用于生成选项卡内容的集合

SelectedItem

获取或设置当前选定的项目

SelectedIndex

获取或设置当前选定标签的索引,如果没有选定标签,则返回-1

SelectedValue

获取或设置当前选择的值

SelectedValuePath

获取或设置用于从SelectedItem获取SelectedValue的路径

ArrowTemplate

获取或设置箭头按钮的控制模板。右手按钮与左手按钮相同,只是旋转了180度。

DisplayMemberPath

获取或设置源对象上的值的路径,以用作对象的视觉表示

SelectedTabBackground

获取或设置用于所选选项卡背景的画笔

UnselectedTabBackground

获取或设置用于未选中选项卡的背景的画笔

SelectedTabBorderThickness

获取或设置所选标签的边框粗细

SelectedTabForeground

获取或设置用于选定选项卡的前景的画笔

UnselectedTabForeground

获取或设置用于未选中选项卡的前景的画笔

ItemContainerStyle

获取或设置应用于为每个项目生成的容器元素的Style

ItemContainerStyle是最强大的依赖属性,因为它允许每个标签项目的完全定制。该演示应用程序包括带有自定义ItemContainerStyle标签的页眉控件。

另外,控件中显示的文本遵循用户控件的标准FontSize,FontFamily和FontStyle的依赖特性。

实现

选项卡页眉控件使用两个按钮控件和一个水平列表的修改列表框实现。列表框由TabHeader类实现,该类派生自标准ListBox类,并增加了重新排列项目的功能。尽管确定如何实现所需的功能并非易事,但是代码很容易理解。

注释

选项卡页眉控件不支持垂直选项卡。通过修改基础TabHeader类来添加它并不难。

WPF标签页眉控件,其中包含滚动按钮,可移动标签项和每个标签中的关闭按钮相关推荐

  1. wpf 点击某控件范围之外的区域 该控件隐藏_iOS平台设计规范(八)控件Controls...

    无论是UI.交互,还是产品经理,都应该熟读iOS平台设计规范.这对我们的产品设计,百利而无一弊.    控件(Controls) 一.按钮(Buttons) 按钮常用于触发特定操作,可自定义的背景颜色 ...

  2. [代码]获取源页的控件值

    重点总结 在ASP.NET中,要想从目标页获取源页的数据信息,可以使用两种方法: 一是通过获取源页的控件进而获取控件的属性值. 二是直接通过获取源页公开的公共属性来获取源页数据. 本示例代码则演示如何 ...

  3. 卷尺系列控件,包含:普通卷尺(如:体重)、金额尺、时间尺

    RuleView 项目地址:zjun615/RuleView  简介:卷尺系列控件,包含:普通卷尺(如:体重).金额尺.时间尺 更多:作者   提 Bug 标签: 一系列卷尺控件,包含:基本卷尺控件( ...

  4. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

    Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 参考文章: (1)Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决 (2)https://www. ...

  5. WPF IP地址输入控件的实现

    WPF IP地址输入控件的实现 原文:WPF IP地址输入控件的实现 一.前言 WPF没有内置IP地址输入控件,因此我们需要通过自己定义实现. 我们先看一下IP地址输入控件有什么特性: 输满三个数字焦 ...

  6. VS2008 Tips #008 如何创建ASP.NET Web 用户控件并包含在Web 页面中

    在 Visual Web Developer 中创建 ASP.NET Web 用户控件就像 ASP.NET Page 页面一样简单. 以下是创建步骤: 1.打开您想添加用户控件的站点. 2.右键点击站 ...

  7. WPF 绑定StaticResource到控件的方法

    WPF 绑定StaticResource到控件的方法 原文:WPF 绑定StaticResource到控件的方法 资源文件内的属性能否直接通过绑定应用到控件?答案是肯定的. 比如,我们要直接把下面的& ...

  8. WPF编程,将控件所呈现的内容保存成图像的一种方法。

    WPF编程,将控件所呈现的内容保存成图像的一种方法. 原文:WPF编程,将控件所呈现的内容保存成图像的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.ne ...

  9. SAP屏幕设计器专题:页签控件(八)

    SO,此篇随笔用来讲解SAP屏幕中页签控件的使用. 一.运行SE38,新建一只程序 Z_SCREEN3,不用写任何代码,保存激活. 二.运行SE51,新建屏幕号0100,输入说明,点击"格式 ...

最新文章

  1. MongoDB的update和set的用法
  2. JavaScript-创建日志调试对象(面向对象实例)
  3. mysql的等号是什么意思_整理思维——等于等于等于?{MySQL条件等号的异常}
  4. 不让html缓存图片吗,html – 如何强制Web浏览器不缓存图像
  5. 提交form前先使用JS进行验证
  6. python整型图_基于PIL的图像整形与裁剪矢量化
  7. Python爬虫入门教程 29-100 手机APP数据抓取 pyspider
  8. 关于 springboot 的自动配置
  9. 汇编实验五 编写、调试具有多个段的程序
  10. matlab legend分栏,word排版技巧
  11. 表单进阶 单选框 多选框
  12. java 字符串长度截取,实现java字符串长度截取功能,java字符串长度截取
  13. QQ音乐外链html,QQ音乐Mp3外链设计办法
  14. 深圳盛世光影简述影视后期制作包括哪些工作?
  15. python replace 空格数据处理
  16. xshell中黏贴时,出现vi乱行问题
  17. 林轩田机器学习基石课程个人笔记-第六讲
  18. 如何选择制作PCB测试治具材料
  19. web 前端判断身份证号码是否有效
  20. ES5 ES6相关内容 day15

热门文章

  1. centos上升级node_在centos7安装nodejs并升级nodejs到最新版本
  2. python 统计分析 包_Python 数据分析包:pandas 基础
  3. opencv读取usb摄像头_2020 款 11寸 iPad Pro 深度摄像头 RGBD 视频流可视化
  4. 计算机不属于发明保护客体,如何判断两种类型的计算机程序发明能否成为专利保护客体?...
  5. 自动化学matlab,自动化Matlab而无需用户登录
  6. 设计灵感|举足轻重!登录、注册页面设计案例
  7. 极简风海报作品合集|过目不忘的海报大片,越看越过瘾
  8. php使用常量cont,php常量介绍
  9. 分块 数据不相同_ArcGIS四分法分幅栅格数据(超强版)
  10. mui获取php表格,Mui table实现数据提取方法