相关文章推荐

现在让我们从简单的示例开始 在窗体中放置一个非常标准的 Tab 控件,并添加一组 Tab

< Window x : Class ="TabControlTutorial.Window1"

xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"

Title ="WPF Tabs" Height ="281" Width ="454">

< TabControl >

< TabItem Header ="Cheese">

The Cheese Tab

</ TabItem >

< TabItem Header ="Pepperoni">

The Pepperoni Tab

</ TabItem >

< TabItem Header ="Mushrooms">

The Mushrooms Tab

</ TabItem >

</ TabControl >

</ Grid >

</ Window >

上面的代码给出一个非常标准的 Tab 控件外观,如下图所示。

像其他 WPF 控件一样, TabItem 中可以包含其他任何 WPF 控件。

< Window x : Class ="TabControlTutorial.Window1"

xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"

Title ="WPF Tabs" Height ="281" Width ="454">

< TabControl >

< TabItem Header ="Cheese">

The Cheese Tab

</ TabItem >

< TabItem Header ="Pepperoni">

< Image Source ="pepperoni.jpg" />

</ TabItem >

< TabItem Header ="Mushrooms">

The Mushrooms Tab

</ TabItem >

</ TabControl >

</ Grid >

</ Window >

上面的代码,如下显示:

这是简单的图像填充。如果你要的是每个 Tab 控件的每个 Tab 有自己的内容,上面的代码就可以了。让我们看一些更有趣的东西吧。就像 TabItem 中的内容一样, TabItem Header 属性也能包含其他的 WPF 控件。让我们在每个 Tab 中放置图片。

< Window x : Class ="TabControlTutorial.MainWindow"

xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"

Title ="MainWindow" Height ="350" Width ="525">

< TabControl >

< TabItem >

< TabItem.Header >

< StackPanel Orientation ="Horizontal">

< Image Height ="18" Source ="cheese.jpg" />

< TextBlock Text ="Cheese" Margin ="2,0,0,0"

VerticalAlignment ="Center" />

</ StackPanel >

</ TabItem.Header >

</ TabItem >

< TabItem >

< TabItem.Header >

< StackPanel Orientation ="Horizontal">

< Image Height ="18" Source ="pepperoni.jpg" />

< TextBlock Text ="Pepperoni" Margin ="2,0,0,0"

VerticalAlignment ="Center" />

</ StackPanel >

</ TabItem.Header >

</ TabItem >

< TabItem >

< TabItem.Header >

< StackPanel Orientation ="Horizontal">

< Image Height ="18" Source ="mushrooms.jpg" />

< TextBlock Text ="Mushrooms" Margin ="2,0,0,0"

VerticalAlignment ="Center" />

</ StackPanel >

</ TabItem.Header >

</ TabItem >

</ TabControl >

</ Grid >

</ Window >

做了上述操作后,如下图显示:

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 680460288 22 0 262145 0;} @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:华文中宋; panose-1:2 1 6 0 4 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:647 135200768 16 0 262303 0;} @font-face {font-family:"/@华文中宋"; panose-1:2 1 6 0 4 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:647 135200768 16 0 262303 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 680460288 22 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-para-margin-top:.5gd; mso-para-margin-right:0cm; mso-para-margin-bottom:0cm; mso-para-margin-left:0cm; mso-para-margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:15.0pt; font-family:"Courier New"; mso-fareast-font-family:华文中宋; mso-bidi-font-family:宋体; color:black; mso-font-kerning:18.0pt; mso-bidi-font-weight:bold;} a:link, span.MsoHyperlink {mso-style-priority:99; color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {mso-style-noshow:yes; mso-style-priority:99; color:purple; mso-themecolor:followedhyperlink; text-decoration:underline; text-underline:single;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; mso-bidi-font-size:15.0pt; mso-ascii-font-family:"Courier New"; mso-fareast-font-family:华文中宋; mso-hansi-font-family:"Courier New"; mso-bidi-font-family:宋体; color:black; mso-font-kerning:18.0pt; mso-bidi-font-weight:bold;} .MsoPapDefault {mso-style-type:export-only; margin-top:0cm; mso-para-margin-top:.5gd; text-align:justify; text-justify:inter-ideograph;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

有了上述的技术,你几乎可以使用 Tab 控件做任何事情。你所不能做的是,改变下划线选项卡的外观。幸运的是, WPF 的样式系统简化了 Tab 控件的外观控制。默认情况下,选项卡的颜色依赖于运行在机器上的 Windows 主题。我们先修改标签的颜色和形状。

我们首先要做的是为 TabItem 控件定义我们需要的样式。 WPF 的样式和 Web 页面中的 CSS 是类似的,但功能更强大。

< Window x : Class ="TabControlTutorial.MainWindow"

xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns : x ="http://schemas.microsoft.com/winfx/2006/xaml"

Title ="MainWindow" Height ="350" Width ="525">

< Window.Resources >

< Style TargetType ="{ x : Type TabItem }">

< Setter Property ="Template">

< Setter.Value >

< ControlTemplate TargetType ="{ x : Type TabItem }">

< Border Name ="Border" Background ="LightBlue"

BorderBrush ="Black" BorderThickness ="1,1,1,1"

CornerRadius ="6,6,0,0" >

< ContentPresenter x : Name ="ContentSite"

VerticalAlignment ="Center"

HorizontalAlignment ="Center"

ContentSource ="Header" Margin ="12,2,12,2"/>

</ Border >

</ Grid >

</ ControlTemplate >

</ Setter.Value >

</ Setter >

</ Style >

</ Window.Resources >

< TabControl >

< TabItem Header ="Cheese" />

< TabItem Header ="Pepperoni" />

< TabItem Header ="Mushrooms" />

</ TabControl >

</ Grid >

</ Window >

样式定义在控件的资源中 这个例子 Window 包含了 Tab 控件。这里有一些说明,大部分是摘自 MSDN http://msdn2.microsoft.com/en-us/library/ms752032.aspx )。让我们逐个标记来说明。

< Style TargetType ="{ x : Type TabItem }">

我们在这里为特殊类型的控件定义了样式 – TabItem 。在 Window 中的任何 TabItem 都使用这个样式显示。

< Setter Property ="Template">

< Setter.Value >

< ControlTemplate TargetType ="{ x : Type TabItem }">

这个样式简单的设置了 TabItem Template 属性。 WPF 控件大多数类型都包含 Template ,你可以让它看起来像你想要的东西。

< Border Name ="Border" Background ="LightBlue" BorderBrush ="Black"

BorderThickness ="1,1,1,1" CornerRadius ="6,6,0,0" >

< ContentPresenter x : Name ="ContentSite" VerticalAlignment ="Center"

HorizontalAlignment ="Center" ContentSource ="Header"

Margin ="12,2,12,2"/>

</ Border >

</ Grid >

在这个模板中,我们简单的放置了一个网格并给 Tab 一个边框及设置了背景色和一些圆角。这个 ContentPresenter 显示在我们的 TabItem 在这个例子中你可以放置任何导向在头部。对 Tab 控件应用了这个样式,我们应用程序看上去如下图所示:

你可能注意到没有选中的 Tab 和选中的 Tab 没有什么不同,这也不是太糟糕的。这是因为当你重写 TabItem 的样式,将会对所有的都有影响。使用触发器实现就比较简单了。

< Style TargetType ="{ x : Type TabItem }">

< Setter Property ="Template">

< Setter.Value >

< ControlTemplate TargetType ="{ x : Type TabItem }">

< Border Name ="Border" Background ="LightBlue"

BorderBrush ="Black" BorderThickness ="1,1,1,1"

CornerRadius ="6,6,0,0" >

< ContentPresenter x : Name ="ContentSite"

VerticalAlignment ="Center"

HorizontalAlignment ="Center"

ContentSource ="Header" Margin ="12,2,12,2"/>

</ Border >

</ Grid >

< ControlTemplate.Triggers >

< Trigger Property ="IsSelected" Value ="True">

< Setter TargetName ="Border" Property ="Background"

Value ="LightBlue" />

</ Trigger >

< Trigger Property ="IsSelected" Value ="False">

< Setter TargetName ="Border" Property ="Background"

Value ="LightGray" />

</ Trigger >

</ ControlTemplate.Triggers >

</ ControlTemplate >

</ Setter.Value >

</ Setter >

</ Style >

TabItem 被点击是,它的 IsSelected 属性被设置为 true 。因此,我们必须添加触发器观察 IsSelected 属性。当这个属性变为 true ,背景色设置为浅蓝色。当它为 false 是,背景色设置为浅灰色。现在运行后结果如下图所示:

我认为我们可以比较好的控制 Tab 控件了。现在我想改变 Tab 内容的背景色和边框。这和 Tab 的样式定义非常相似,只是我们都要 TabItem 的样式。

< Style TargetType ="{ x : Type TabControl }">

< Setter Property ="Template">

< Setter.Value >

< ControlTemplate TargetType ="{ x : Type TabControl }">

< Grid.RowDefinitions >

< RowDefinition Height ="Auto"/>

< RowDefinition Height ="*"/>

</ Grid.RowDefinitions >

< TabPanel Grid.Row ="0" Panel.ZIndex ="1" Margin ="0,0,4,-1"

IsItemsHost ="True" Background ="Transparent" />

< Border Grid.Row ="1" BorderBrush ="Black" BorderThickness ="1"

CornerRadius ="0, 12, 12, 12" >

< Border.Background >

< LinearGradientBrush >

< GradientStop Color ="LightBlue" Offset ="0" />

< GradientStop Color ="White" Offset ="1" />

</ LinearGradientBrush >

</ Border.Background >

< ContentPresenter ContentSource ="SelectedContent" />

</ Border >

</ Grid >

</ ControlTemplate >

</ Setter.Value >

</ Setter >

</ Style >

使用这个代码后现在 Tab 表情看起来如下所示:

在这片文中中学习了如何创建和填充一个基本的 Tab 控件,还有更多设置 Tab Tab 内容的样式的先进技术。我认为这是 WPF 样式学习曲线的一小步,但你一点了解了它,你可以看到它是如此的强大。最棒的是,在这里我定义我的 Tab 控件的皮肤没有写任何 C# 代码。

原文地址:http://www.dingos.cn/index.php?topic=2014.0 在WinForm中的Tab控件,有许多不足的地方。如果你想对样式或功能做出改变,最好从头开始自己编写Tab控件。WPF中的Tab控件向正确的方向迈了一大步,因为WPF的强大的样式和控件模板,你几乎可以完全控制Tab控件的外观。
主要讲一下如何通过点击菜单,实现动态加载 Tab Control的功能,准确来说应该是动态加载 Tab Item,要实现这个功能,我们需要解决两个问题: 点击菜单的时候,需要传进来一个你要加载的UserControl 控件 的名称,让程序知道你要加载的是哪个 控件 。 通过传进来的UserControl 控件 名实例化UserControl 控件 (利用反射来实例化UserControl 控件 )。 关于第一点,我通过在...
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居 、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
概述 Tab 页面是一个很常用的 控件 ,针对页面固定的场景,直接给Item进行数据绑定就行,如下所示:<dx:DX Tab Control cal:Message.Attach="[Event Loaded]=[ Tab Control_Loaded($source,$eventArgs)]"> <dx:DX Tab Item Header ="{B...
我们的项目,不论是C/S还是B/S总会用到 Tab 标签的,实现我们的切换效果。最近一直做 WPF 的项目,其实他们的用法都是大同小异的。 那么,.Resx存放文件又是怎么存放呢,一般会存放什么样的文件呢?这样有什么好处呢? 原因很简单,容我一一道来。 .Resx文件,属于资源文件。我们可以将公有资源文件 的图片,Text文本等资源存放至此,
2、基本的一个结构如下: < Tab Control Margin="5" Tab StripPlacement="top" > < Tab Item Header =" Tab Item1" Name=" Tab Item1"> 我可以为您介绍一些 WPF 代码编写自定义 控件 添加到Grid 控件 的方法: 1.将自定义 控件 添加到Grid 控件 ,可以使用Grid.Children.Add方法。 2.可以使用Grid.SetRow和Grid.SetColumn方法来设置 控件 位置。 3.可以使用Grid.SetRowSpan和Grid.SetColumnSpan方法来设置 控件 的大小。 4.可以使用Grid.SetRowDefinition和Grid.SetColumnDefinition来添加新行/列。
 
推荐文章