WPF TabControl控件示例

运行效果:

主窗体XAML代码:

<Window x:Class="WPF0417.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WPF0417"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Border Background="#9C734B"><Grid><TabControl Style="{StaticResource TabControlStyle}"><TabItem Header="首页" Foreground="#ddffffff" Style="{StaticResource TabItemStyle}"></TabItem><TabItem Header="新闻" Foreground="#ddffffff" Style="{StaticResource TabItemStyle}"></TabItem><TabItem Header="专题" Foreground="#ddffffff" Style="{StaticResource TabItemStyle}"></TabItem><TabItem Header="社区" Foreground="#ddffffff" Style="{StaticResource TabItemStyle}"></TabItem><TabItem Header="活动" Foreground="#ddffffff" Style="{StaticResource TabItemStyle}"></TabItem><TabItem Header="交流" Foreground="#ddffffff" Style="{StaticResource TabItemStyle}"></TabItem><TabItem Header="关于" Foreground="#ddffffff" Style="{StaticResource TabItemStyle}"></TabItem></TabControl></Grid></Border>
</Window>

新建一个Styles文件夹,内部添加一个资源字典文件TabControl,代码如下:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WPF0417.Styles"xmlns:controls="clr-namespace:WPFDemo.Controls"><Style x:Key="TabControlStyle" TargetType="{x:Type TabControl}"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type TabControl}"><Grid Background="Transparent"><Grid.RowDefinitions><RowDefinition Height="Auto"/><RowDefinition Height="*"/></Grid.RowDefinitions><Border  BorderBrush="Transparent" BorderThickness="0 0 0 0"><TabPanel IsItemsHost="True"/></Border><Border Grid.Row="1"BorderBrush="Transparent"Padding="0"BorderThickness="0" Background="{TemplateBinding Background}"><ContentPresenter ContentSource="SelectedContent" Name="PART_SelectedContentHost"/></Border></Grid></ControlTemplate></Setter.Value></Setter></Style><!--TabControl--><Style x:Key="TabItemStyle" TargetType="TabItem"><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="TabItem"><Grid ><Border x:Name="bd"Background="Transparent"Height="30"BorderBrush="Transparent"BorderThickness="0 0 0 0"CornerRadius="0,0,0,0"Margin="0"><TextBlock x:Name="txt" Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent},Path=Header}" VerticalAlignment="Center" Margin="30 0"/></Border><Rectangle Fill="Red" Height="3" VerticalAlignment="Bottom" Visibility="Hidden" Name="LeftSideRectangle"></Rectangle></Grid><ControlTemplate.Triggers><Trigger Property="IsSelected" Value="true"><Setter TargetName="bd" Property="BorderThickness" Value="0,0,0,0" /><Setter TargetName="bd" Property="BorderBrush" Value="Transparent" /><Setter TargetName="bd" Property="Background" Value="#33ffffff" /><Setter TargetName="LeftSideRectangle" Property="Visibility" Value="Visible"></Setter><!--<Setter TargetName="bd" Property="Background" Value="{StaticResource  defaultcolor}" />--><Setter TargetName="txt" Property="Foreground" Value="#fff"/></Trigger><!--<Trigger Property="IsMouseOver" Value="true"><Setter TargetName="txt" Property="Foreground" Value="{StaticResource defaultoverbg}"/></Trigger>--><MultiTrigger><MultiTrigger.Conditions><Condition Property="IsSelected" Value="False"/><Condition Property="IsMouseOver" Value="True"/></MultiTrigger.Conditions><Setter TargetName="txt" Property="Foreground" Value="#fff"/></MultiTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><Style x:Key="TabControlStyle1" TargetType="{x:Type TabControl}"><Setter Property="Padding" Value="2"/><Setter Property="HorizontalContentAlignment" Value="Center"/><Setter Property="VerticalContentAlignment" Value="Center"/><Setter Property="Background" Value="White"/><Setter Property="BorderBrush" Value="#FFACACAC"/><Setter Property="BorderThickness" Value="1"/><Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type TabControl}"><Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}"><Grid x:Name="templateRoot" ClipToBounds="True" SnapsToDevicePixels="True" KeyboardNavigation.TabNavigation="Local"><Grid.ColumnDefinitions><ColumnDefinition x:Name="ColumnDefinition0"/><ColumnDefinition x:Name="ColumnDefinition1" Width="0"/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition x:Name="RowDefinition0" Height="Auto"/><RowDefinition x:Name="RowDefinition1" Height="*"/></Grid.RowDefinitions><UniformGrid x:Name="HeaderPanel" Rows="1" Background="Transparent" Grid.Column="0" IsItemsHost="True" Margin="0" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/><Line X1="0" X2="{Binding ActualWidth, RelativeSource={RelativeSource Self}}" Stroke="White" StrokeThickness="0.1" VerticalAlignment="Bottom" Margin="0 0 0 1" SnapsToDevicePixels="True"/><Border x:Name="ContentPanel" BorderThickness="0" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local"><ContentPresenter x:Name="PART_SelectedContentHost" ContentTemplate="{TemplateBinding SelectedContentTemplate}" Content="{TemplateBinding SelectedContent}" ContentStringFormat="{TemplateBinding SelectedContentStringFormat}" ContentSource="SelectedContent" Margin="0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/></Border></Grid></Border><ControlTemplate.Triggers><Trigger Property="TabStripPlacement" Value="Bottom"><Setter Property="Grid.Row" TargetName="HeaderPanel" Value="1"/><Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/><Setter Property="Height" TargetName="RowDefinition0" Value="*"/><Setter Property="Height" TargetName="RowDefinition1" Value="Auto"/></Trigger><Trigger Property="TabStripPlacement" Value="Left"><Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/><Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/><Setter Property="Grid.Column" TargetName="HeaderPanel" Value="0"/><Setter Property="Grid.Column" TargetName="ContentPanel" Value="1"/><Setter Property="Width" TargetName="ColumnDefinition0" Value="Auto"/><Setter Property="Width" TargetName="ColumnDefinition1" Value="*"/><Setter Property="Height" TargetName="RowDefinition0" Value="*"/><Setter Property="Height" TargetName="RowDefinition1" Value="0"/></Trigger><Trigger Property="TabStripPlacement" Value="Right"><Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/><Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/><Setter Property="Grid.Column" TargetName="HeaderPanel" Value="1"/><Setter Property="Grid.Column" TargetName="ContentPanel" Value="0"/><Setter Property="Width" TargetName="ColumnDefinition0" Value="*"/><Setter Property="Width" TargetName="ColumnDefinition1" Value="Auto"/><Setter Property="Height" TargetName="RowDefinition0" Value="*"/><Setter Property="Height" TargetName="RowDefinition1" Value="0"/></Trigger><Trigger Property="IsEnabled" Value="False"><Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><Style x:Key="TabItemStyle1" TargetType="{x:Type TabItem}"><Setter Property="Foreground" Value="White"/><Setter Property="Background" Value="Transparent"/><Setter Property="BorderBrush" Value="#FFACACAC"/><Setter Property="Margin" Value="0"/><Setter Property="HorizontalContentAlignment" Value="Stretch"/><Setter Property="VerticalContentAlignment" Value="Stretch"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type TabItem}"><Grid x:Name="templateRoot"  SnapsToDevicePixels="True" Background="Transparent"><TextBlock x:Name="txt" Visibility="Visible" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{TemplateBinding Header}" ToolTip="{TemplateBinding Header}" Foreground="{TemplateBinding Foreground}" TextTrimming="CharacterEllipsis" /></Grid><ControlTemplate.Triggers><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="true"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Top"/></MultiDataTrigger.Conditions><Setter Property="Foreground" TargetName="txt" Value="#fffea1"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Left"/></MultiDataTrigger.Conditions><Setter Property="Opacity" TargetName="templateRoot" Value="0.56"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Bottom"/></MultiDataTrigger.Conditions><Setter Property="Opacity" TargetName="templateRoot" Value="0.56"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Right"/></MultiDataTrigger.Conditions><Setter Property="Opacity" TargetName="templateRoot" Value="0.56"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Top"/></MultiDataTrigger.Conditions><Setter Property="Opacity" TargetName="templateRoot" Value="0.56"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="true"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Top"/></MultiDataTrigger.Conditions><Setter Property="Panel.ZIndex" Value="1"/><Setter Property="Foreground" TargetName="txt" Value="#fffea1"/></MultiDataTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><Style x:Key="TabControlWithUnderLineStyle" TargetType="{x:Type TabControl}"><Setter Property="Padding" Value="2"/><Setter Property="HorizontalContentAlignment" Value="Center"/><Setter Property="VerticalContentAlignment" Value="Center"/><Setter Property="Background" Value="White"/><Setter Property="BorderBrush" Value="#FFACACAC"/><Setter Property="BorderThickness" Value="1"/><Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type TabControl}"><Grid x:Name="templateRoot" ClipToBounds="True" Background="{TemplateBinding Background}" SnapsToDevicePixels="True" KeyboardNavigation.TabNavigation="Local"><Grid.ColumnDefinitions><ColumnDefinition x:Name="ColumnDefinition0"/><ColumnDefinition x:Name="ColumnDefinition1" Width="0"/></Grid.ColumnDefinitions><Grid.RowDefinitions><RowDefinition x:Name="RowDefinition0" Height="Auto"/><RowDefinition x:Name="RowDefinition1" Height="*"/></Grid.RowDefinitions><TabPanel x:Name="HeaderPanel" HorizontalAlignment="Center" Background="Transparent" Grid.Column="0" IsItemsHost="True" Margin="0" Grid.Row="0" KeyboardNavigation.TabIndex="1" Panel.ZIndex="1"/><Line X1="0" X2="{Binding ActualWidth, RelativeSource={RelativeSource Self}}" Stroke="Gray" StrokeThickness="0.1" VerticalAlignment="Bottom" Margin="0 0 0 1" SnapsToDevicePixels="True"/><Border x:Name="ContentPanel" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.Column="0" KeyboardNavigation.DirectionalNavigation="Contained" Grid.Row="1" KeyboardNavigation.TabIndex="2" KeyboardNavigation.TabNavigation="Local"><ContentPresenter x:Name="PART_SelectedContentHost" ContentTemplate="{TemplateBinding SelectedContentTemplate}" Content="{TemplateBinding SelectedContent}" ContentStringFormat="{TemplateBinding SelectedContentStringFormat}" ContentSource="SelectedContent" Margin="0" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/></Border></Grid><ControlTemplate.Triggers><Trigger Property="TabStripPlacement" Value="Bottom"><Setter Property="Grid.Row" TargetName="HeaderPanel" Value="1"/><Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/><Setter Property="Height" TargetName="RowDefinition0" Value="*"/><Setter Property="Height" TargetName="RowDefinition1" Value="Auto"/></Trigger><Trigger Property="TabStripPlacement" Value="Left"><Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/><Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/><Setter Property="Grid.Column" TargetName="HeaderPanel" Value="0"/><Setter Property="Grid.Column" TargetName="ContentPanel" Value="1"/><Setter Property="Width" TargetName="ColumnDefinition0" Value="Auto"/><Setter Property="Width" TargetName="ColumnDefinition1" Value="*"/><Setter Property="Height" TargetName="RowDefinition0" Value="*"/><Setter Property="Height" TargetName="RowDefinition1" Value="0"/></Trigger><Trigger Property="TabStripPlacement" Value="Right"><Setter Property="Grid.Row" TargetName="HeaderPanel" Value="0"/><Setter Property="Grid.Row" TargetName="ContentPanel" Value="0"/><Setter Property="Grid.Column" TargetName="HeaderPanel" Value="1"/><Setter Property="Grid.Column" TargetName="ContentPanel" Value="0"/><Setter Property="Width" TargetName="ColumnDefinition0" Value="*"/><Setter Property="Width" TargetName="ColumnDefinition1" Value="Auto"/><Setter Property="Height" TargetName="RowDefinition0" Value="*"/><Setter Property="Height" TargetName="RowDefinition1" Value="0"/></Trigger><Trigger Property="IsEnabled" Value="False"><Setter Property="TextElement.Foreground" TargetName="templateRoot" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><Style x:Key="TabItemExWithUnderLineStyle"  TargetType="{x:Type TabItem}"><Setter Property="Foreground" Value="White"/><Setter Property="Background" Value="Transparent"/><Setter Property="BorderBrush" Value="#FFACACAC"/><Setter Property="Margin" Value="0"/><Setter Property="HorizontalContentAlignment" Value="Stretch"/><Setter Property="VerticalContentAlignment" Value="Stretch"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type TabItem}"><Grid x:Name="templateRoot"  SnapsToDevicePixels="True" Background="Transparent"><Border x:Name="_underline" BorderBrush="#37aefe" BorderThickness="0" Margin="{TemplateBinding Margin}"/><Grid><TextBlock x:Name="txt" Visibility="Visible" VerticalAlignment="Center" HorizontalAlignment="Center" Text="{TemplateBinding Header}" ToolTip="{TemplateBinding Header}" Foreground="{TemplateBinding Foreground}" TextTrimming="CharacterEllipsis" /></Grid></Grid><ControlTemplate.Triggers><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="true"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Top"/></MultiDataTrigger.Conditions><Setter Property="Foreground" TargetName="txt" Value="#37aefe"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Left"/></MultiDataTrigger.Conditions><Setter Property="Opacity" TargetName="templateRoot" Value="0.56"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Bottom"/></MultiDataTrigger.Conditions><Setter Property="Opacity" TargetName="templateRoot" Value="0.56"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Right"/></MultiDataTrigger.Conditions><Setter Property="Opacity" TargetName="templateRoot" Value="0.56"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Top"/></MultiDataTrigger.Conditions><Setter Property="Opacity" TargetName="templateRoot" Value="0.56"/></MultiDataTrigger><MultiDataTrigger><MultiDataTrigger.Conditions><Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="true"/><Condition Binding="{Binding TabStripPlacement, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type TabControl}}}" Value="Top"/></MultiDataTrigger.Conditions><Setter Property="Panel.ZIndex" Value="1"/><Setter Property="Foreground" TargetName="txt" Value="#37aefe"/><Setter Property="BorderThickness" TargetName="_underline" Value="0 0 0 2"/></MultiDataTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><Style TargetType="{x:Type controls:TabItemClose}"><Setter Property="HorizontalContentAlignment" Value="Stretch"/><Setter Property="VerticalContentAlignment" Value="Stretch"/><Setter Property="Foreground" Value="#666666"/><Setter Property="Margin" Value="0 0 0 0"/><Setter Property="Padding" Value="0"/><Setter Property="BorderThickness" Value="0"/><Setter Property="CloseIcon" Value="/Images/close.png"/><Setter Property="NormalBackground" Value="White"/><Setter Property="OverBackgound" Value="#33ca5100"/><Setter Property="SelectedBackgound" Value="#ca5100"/><Setter Property="NormalForeground" Value="#555558"/><Setter Property="OverForeground" Value="White"/><Setter Property="SelectedForeground" Value="White"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type controls:TabItemClose}"><Border x:Name="_bordertop"   Width="{TemplateBinding Width}" MaxWidth="{TemplateBinding MaxWidth}" Height="{TemplateBinding Height}" CornerRadius="{TemplateBinding CornerRadius}"  Background="{TemplateBinding NormalBackground}" BorderThickness="{TemplateBinding BorderThickness}"BorderBrush="{TemplateBinding BorderBrush}" ToolTip="{TemplateBinding Header}"  ><DockPanel><Image x:Name="_logo" DockPanel.Dock="Left" Visibility="Visible" Margin="{TemplateBinding LogoPadding}" Source="{TemplateBinding LogoIcon}" VerticalAlignment="Center"  HorizontalAlignment="Center" Stretch="Uniform" Width="{TemplateBinding LogoIconWidth}" Height="{TemplateBinding LogoIconHeigth}" /><Grid Name="_grid" SnapsToDevicePixels="True"><Grid.ColumnDefinitions><ColumnDefinition Width="*" /><ColumnDefinition x:Name="_col_close" Width="20" /></Grid.ColumnDefinitions><Border Grid.ColumnSpan="2" Background="White" Opacity="0"/><TextBlock   x:Name="_txt" VerticalAlignment="Center" TextTrimming="CharacterEllipsis"  Margin="3 0 3 0"   Foreground="{TemplateBinding NormalForeground}" TextAlignment="Center" HorizontalAlignment="Center"   Text="{TemplateBinding Header}"  /><Grid x:Name="_gridclose" Grid.Column="1"  ><Border x:Name="_borderbg" Background="Black" Opacity="0" /><controls:ButtonEx x:Name="PART_Close_TabItem" HorizontalAlignment="Center"  VerticalAlignment="Center" Background="Transparent" Visibility="Visible" Icon="{TemplateBinding CloseIcon}"  ButtonType="Icon" /></Grid></Grid></DockPanel></Border><ControlTemplate.Triggers><Trigger Property="LogoIcon" Value="{x:Null}"><Setter TargetName="_logo" Property="Visibility" Value="Collapsed" /></Trigger><Trigger Property="IsCanClose" Value="false"><Setter TargetName="_gridclose" Property="Visibility" Value="Collapsed"/><Setter TargetName="_col_close" Property="Width" Value="0"/></Trigger><Trigger Property="IsSelected" Value="true"><Setter TargetName="_bordertop" Property="Background" Value="{Binding SelectedBackgound,RelativeSource={RelativeSource TemplatedParent}}" /><Setter TargetName="_txt"  Property="Foreground" Value="{Binding SelectedForeground,RelativeSource={RelativeSource TemplatedParent}}"/></Trigger><MultiTrigger><MultiTrigger.Conditions><Condition Property="IsMouseOver" Value="true"/><Condition Property="IsSelected" Value="false"/></MultiTrigger.Conditions><Setter TargetName="_txt"  Property="Foreground" Value="{Binding OverForeground,RelativeSource={RelativeSource TemplatedParent}}"/><Setter TargetName="_bordertop"  Property="Background" Value="{Binding OverBackgound,RelativeSource={RelativeSource TemplatedParent}}"/></MultiTrigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary>

添加一个Controls文件夹,内部添加上个类ButtonEx,MultiComboBox,TabItemClose,代码如下:
ButtonEx类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;namespace WPFDemo.Controls
{public class ButtonEx : Button{static ButtonEx(){DefaultStyleKeyProperty.OverrideMetadata(typeof(ButtonEx), new FrameworkPropertyMetadata(typeof(ButtonEx)));}public ButtonType ButtonType{get { return (ButtonType)GetValue(ButtonTypeProperty); }set { SetValue(ButtonTypeProperty, value); }}public static readonly DependencyProperty ButtonTypeProperty =DependencyProperty.Register("ButtonType", typeof(ButtonType), typeof(ButtonEx), new PropertyMetadata(ButtonType.Normal));public ImageSource Icon{get { return (ImageSource)GetValue(IconProperty); }set { SetValue(IconProperty, value); }}public static readonly DependencyProperty IconProperty =DependencyProperty.Register("Icon", typeof(ImageSource), typeof(ButtonEx), new PropertyMetadata(null));public CornerRadius CornerRadius{get { return (CornerRadius)GetValue(CornerRadiusProperty); }set { SetValue(CornerRadiusProperty, value); }}public static readonly DependencyProperty CornerRadiusProperty =DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(ButtonEx), new PropertyMetadata(new CornerRadius(0)));public Brush MouseOverForeground{get { return (Brush)GetValue(MouseOverForegroundProperty); }set { SetValue(MouseOverForegroundProperty, value); }}public static readonly DependencyProperty MouseOverForegroundProperty =DependencyProperty.Register("MouseOverForeground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());public Brush MousePressedForeground{get { return (Brush)GetValue(MousePressedForegroundProperty); }set { SetValue(MousePressedForegroundProperty, value); }}public static readonly DependencyProperty MousePressedForegroundProperty =DependencyProperty.Register("MousePressedForeground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());public Brush MouseOverBorderbrush{get { return (Brush)GetValue(MouseOverBorderbrushProperty); }set { SetValue(MouseOverBorderbrushProperty, value); }}public static readonly DependencyProperty MouseOverBorderbrushProperty =DependencyProperty.Register("MouseOverBorderbrush", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());public Brush MouseOverBackground{get { return (Brush)GetValue(MouseOverBackgroundProperty); }set { SetValue(MouseOverBackgroundProperty, value); }}public static readonly DependencyProperty MouseOverBackgroundProperty =DependencyProperty.Register("MouseOverBackground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());public Brush MousePressedBackground{get { return (Brush)GetValue(MousePressedBackgroundProperty); }set { SetValue(MousePressedBackgroundProperty, value); }}public static readonly DependencyProperty MousePressedBackgroundProperty =DependencyProperty.Register("MousePressedBackground", typeof(Brush), typeof(ButtonEx), new PropertyMetadata());protected override void OnClick(){base.OnClick();if (!string.IsNullOrEmpty(Name) && Name == "PART_Close_TabItem"){TabItemClose itemclose = FindVisualParent<TabItemClose>(this);(itemclose.Parent as TabControl).Items.Remove(itemclose);RoutedEventArgs args = new RoutedEventArgs(TabItemClose.CloseItemEvent, itemclose);itemclose.RaiseEvent(args);}}public static T FindVisualParent<T>(DependencyObject obj) where T : class{while (obj != null){if (obj is T)return obj as T;obj = VisualTreeHelper.GetParent(obj);}return null;}}public enum ButtonType{Normal,Icon,Text,IconText}
}

MultiComboBox 类:

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;namespace WPFDemo.Controls
{public class MultiComboBox : ComboBox{static MultiComboBox(){DefaultStyleKeyProperty.OverrideMetadata(typeof(MultiComboBox), new FrameworkPropertyMetadata(typeof(MultiComboBox)));}private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){d.SetValue(e.Property, e.NewValue);}/// <summary>/// 选中项列表/// </summary>public ObservableCollection<MultiCbxBaseData> ChekedItems = new ObservableCollection<MultiCbxBaseData>();/// <summary>/// ListBox竖向列表/// </summary>private ListBox _ListBoxV;/// <summary>/// ListBox横向列表/// </summary>private ListBox _ListBoxH;public override void OnApplyTemplate(){base.OnApplyTemplate();_ListBoxV = Template.FindName("PART_ListBox", this) as ListBox;_ListBoxH = Template.FindName("PART_ListBoxChk", this) as ListBox;_ListBoxH.ItemsSource = ChekedItems;_ListBoxV.SelectionChanged += _ListBoxV_SelectionChanged;_ListBoxH.SelectionChanged += _ListBoxH_SelectionChanged;if (ItemsSource != null){foreach (var item in ItemsSource){MultiCbxBaseData bdc = item as MultiCbxBaseData;if (bdc.IsCheck){_ListBoxV.SelectedItems.Add(bdc);}}}}private void _ListBoxH_SelectionChanged(object sender, SelectionChangedEventArgs e){foreach (var item in e.RemovedItems){MultiCbxBaseData datachk = item as MultiCbxBaseData;for (int i = 0; i < _ListBoxV.SelectedItems.Count; i++){MultiCbxBaseData datachklist = _ListBoxV.SelectedItems[i] as MultiCbxBaseData;if (datachklist.ID == datachk.ID){_ListBoxV.SelectedItems.Remove(_ListBoxV.SelectedItems[i]);}}}}void _ListBoxV_SelectionChanged(object sender, SelectionChangedEventArgs e){foreach (var item in e.AddedItems){MultiCbxBaseData datachk = item as MultiCbxBaseData;datachk.IsCheck = true;if (ChekedItems.IndexOf(datachk) < 0){ChekedItems.Add(datachk);}}foreach (var item in e.RemovedItems){MultiCbxBaseData datachk = item as MultiCbxBaseData;datachk.IsCheck = false;ChekedItems.Remove(datachk);}}public class MultiCbxBaseData{private int _id;/// <summary>/// 关联主键/// </summary>public int ID{get { return _id; }set { _id = value; }}private string _viewName;/// <summary>/// 显示名称/// </summary>public string ViewName{get { return _viewName; }set{_viewName = value;}}private bool _isCheck;/// <summary>/// 是否选中/// </summary>public bool IsCheck{get { return _isCheck; }set { _isCheck = value; }}}}
}

TabItemClose类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;namespace WPFDemo.Controls
{public class TabItemClose : TabItem{static TabItemClose(){DefaultStyleKeyProperty.OverrideMetadata(typeof(TabItemClose), new FrameworkPropertyMetadata(typeof(TabItemClose)));}private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){d.SetValue(e.Property, e.NewValue);}/// <summary>/// 是否可以关闭/// </summary>public bool IsCanClose{get { return (bool)GetValue(IsCanCloseProperty); }set { SetValue(IsCanCloseProperty, value); }}public static readonly DependencyProperty IsCanCloseProperty =DependencyProperty.Register("IsCanClose", typeof(bool), typeof(TabItemClose), new PropertyMetadata(true, OnPropertyChanged));/// <summary>/// 关闭的图标/// </summary>public ImageSource CloseIcon{get { return (ImageSource)GetValue(CloseIconProperty); }set { SetValue(CloseIconProperty, value); }}public static readonly DependencyProperty CloseIconProperty =DependencyProperty.Register("CloseIcon", typeof(ImageSource), typeof(TabItemClose), new PropertyMetadata(null, OnPropertyChanged));/// <summary>/// 正常背景色/// </summary>public SolidColorBrush NormalBackground{get { return (SolidColorBrush)GetValue(NormalBackgroundProperty); }set { SetValue(NormalBackgroundProperty, value); }}public static readonly DependencyProperty NormalBackgroundProperty =DependencyProperty.Register("NormalBackground", typeof(SolidColorBrush), typeof(TabItemClose), new PropertyMetadata(null, OnPropertyChanged));/// <summary>/// 悬浮背景色/// </summary>public SolidColorBrush OverBackgound{get { return (SolidColorBrush)GetValue(OverBackgoundProperty); }set { SetValue(OverBackgoundProperty, value); }}public static readonly DependencyProperty OverBackgoundProperty =DependencyProperty.Register("OverBackgound", typeof(SolidColorBrush), typeof(TabItemClose), new PropertyMetadata(null, OnPropertyChanged));/// <summary>/// 选中背景色/// </summary>public SolidColorBrush SelectedBackgound{get { return (SolidColorBrush)GetValue(SelectedBackgoundProperty); }set { SetValue(SelectedBackgoundProperty, value); }}public static readonly DependencyProperty SelectedBackgoundProperty =DependencyProperty.Register("SelectedBackgound", typeof(SolidColorBrush), typeof(TabItemClose), new PropertyMetadata(null, OnPropertyChanged));/// <summary>/// 默认前景色/// </summary>public SolidColorBrush NormalForeground{get { return (SolidColorBrush)GetValue(NormalForegroundProperty); }set { SetValue(NormalForegroundProperty, value); }}public static readonly DependencyProperty NormalForegroundProperty =DependencyProperty.Register("NormalForeground", typeof(SolidColorBrush), typeof(TabItemClose), new PropertyMetadata(null, OnPropertyChanged));/// <summary>/// 悬浮前景色/// </summary>public SolidColorBrush OverForeground{get { return (SolidColorBrush)GetValue(OverForegroundProperty); }set { SetValue(OverForegroundProperty, value); }}public static readonly DependencyProperty OverForegroundProperty =DependencyProperty.Register("OverForeground", typeof(SolidColorBrush), typeof(TabItemClose), new PropertyMetadata(null, OnPropertyChanged));/// <summary>/// 选中前景色/// </summary>public SolidColorBrush SelectedForeground{get { return (SolidColorBrush)GetValue(SelectedForegroundProperty); }set { SetValue(SelectedForegroundProperty, value); }}public static readonly DependencyProperty SelectedForegroundProperty =DependencyProperty.Register("SelectedForeground", typeof(SolidColorBrush), typeof(TabItemClose), new PropertyMetadata(null, OnPropertyChanged));/// <summary>/// 控件圆角/// </summary>public CornerRadius CornerRadius{get { return (CornerRadius)GetValue(CornerRadiusProperty); }set { SetValue(CornerRadiusProperty, value); }}public static readonly DependencyProperty CornerRadiusProperty =DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(TabItemClose), new PropertyMetadata(new CornerRadius(0), OnPropertyChanged));/// <summary>/// 前置Logo/// </summary>public ImageSource LogoIcon{get { return (ImageSource)GetValue(LogoIconProperty); }set { SetValue(LogoIconProperty, value); }}public static readonly DependencyProperty LogoIconProperty =DependencyProperty.Register("LogoIcon", typeof(ImageSource), typeof(TabItemClose), new PropertyMetadata(null, OnPropertyChanged));/// <summary>/// 前置Logo宽度/// </summary>public double LogoIconWidth{get { return (double)GetValue(LogoIconWidthProperty); }set { SetValue(LogoIconWidthProperty, value); }}public static readonly DependencyProperty LogoIconWidthProperty =DependencyProperty.Register("LogoIconWidth", typeof(double), typeof(TabItemClose), new PropertyMetadata(double.Parse("0"), OnPropertyChanged));/// <summary>/// 前置Logo高度/// </summary>public double LogoIconHeigth{get { return (double)GetValue(LogoIconHeigthProperty); }set { SetValue(LogoIconHeigthProperty, value); }}public static readonly DependencyProperty LogoIconHeigthProperty =DependencyProperty.Register("LogoIconHeigth", typeof(double), typeof(TabItemClose), new PropertyMetadata(double.Parse("0"), OnPropertyChanged));/// <summary>/// LogoPadding/// </summary>public Thickness LogoPadding{get { return (Thickness)GetValue(LogoPaddingProperty); }set { SetValue(LogoPaddingProperty, value); }}public static readonly DependencyProperty LogoPaddingProperty =DependencyProperty.Register("LogoPadding", typeof(Thickness), typeof(TabItemClose), new PropertyMetadata(new Thickness(0), OnPropertyChanged));/// <summary>/// 关闭item事件/// </summary>public event RoutedEventHandler CloseItem{add { AddHandler(CloseItemEvent, value); }remove { RemoveHandler(CloseItemEvent, value); }}public static readonly RoutedEvent CloseItemEvent =EventManager.RegisterRoutedEvent("CloseItem", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(TabItemClose));/// <summary>/// 关闭项的右键菜单/// </summary>public ContextMenu ItemContextMenu { get; set; }Border ItemBorder;public override void OnApplyTemplate(){base.OnApplyTemplate();ItemBorder = Template.FindName("_bordertop", this) as Border;if (ItemContextMenu != null){ItemBorder.ContextMenu = ItemContextMenu;}}}
}

在APP.XAML中引用资源字典:

<Application x:Class="WPF0417.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WPF0417"StartupUri="MainWindow.xaml"><Application.Resources><ResourceDictionary><ResourceDictionary.MergedDictionaries><ResourceDictionary Source="Styles/TabControl.xaml"></ResourceDictionary></ResourceDictionary.MergedDictionaries></ResourceDictionary></Application.Resources>
</Application>

文件结构:

WPF TabControl控件示例相关推荐

  1. C# WPF TabControl控件用法详解

    概述 TabControl我之前有讲过一节,内容详见:C# WPF TabControl用法指南(精品),上节主要讲解了tabcontrol控件的左右翻页,以及页面筛选,以及数据绑定等内容,这节内容继 ...

  2. WPF 自定义TabControl控件样式(转)

    WPF 自定义TabControl控件样式 一.前言 程序中经常会用到TabControl控件,默认的控件样式很普通.而且样式或功能不一定符合我们的要求.比如:我们需要TabControl的标题能够居 ...

  3. PIE SDK图层树伙伴控件示例

    1.  功能简介 TocControl控件的主要作用是显示当前加载的图层有哪些.采用什么样的符号等,目的是使用户对当前加载的数据和结构有一个总体的把握.与之相关联的伙伴控件有MapControl,Pa ...

  4. 正则表达式——WPF输入控件TextBox 限定输入特定字符

    正则表达式--WPF输入控件TextBox 限定输入特定字符 原文:正则表达式--WPF输入控件TextBox 限定输入特定字符 概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一 ...

  5. WPF 表格控件 ReoGrid 的简单使用

    WPF 表格控件 ReoGrid 的简单使用 目录 一.概述 二.安装 三.添加控件 四.加载 Excel 五.属性设置 六.支持触摸滚动 七.其它操作 1.显示和隐藏列 2.显示特定字体 八.资源链 ...

  6. OxyPlot.Wpf 图表控件使用备忘

    OxyPlot.Wpf 图表控件使用备忘 目录 OxyPlot.Wpf 图表控件使用备忘 一.OxyPlot.Wpf 控件信息 二.基本概念 (一) PlotView 和 Plot (二) PlotM ...

  7. WPF开源控件扩展库 - MaterialDesignExtensions

    WPF开源控件扩展库 - MaterialDesignExtensions MaterialDesignExtensions仓库截图 logo Material Design Extensions 在 ...

  8. Layui版本的WPF开源控件库-Layui-WPF

    大家好,我是沙漠尽头的狼. 今天介绍一款Layui风格的WPF开源控件库,仓库信息如下: 仓库地址:https://github.com/Layui-WPF-Team/Layui-WPF 仓库截图: ...

  9. C# WPF 歌词控件(支持逐字定位描色效果)

    C# WPF 歌词控件(支持逐字定位描色效果) 原文:C# WPF 歌词控件(支持逐字定位描色效果) 之前做了一个模仿网易云歌词的控件,实现了加载网易云歌词并能随音乐播放进度定位歌词.今天呢将在这个控 ...

最新文章

  1. 有光照就能上网 0.2秒即可下载一部高清电影
  2. c语言随机函数五位数,【分享代码】弥补c语言随机数不足
  3. commons-lang StringUtils#split的坑
  4. 验证输入字符串是否包含特殊字符
  5. ADS2017打开出现cannot create the directory,解决办法。
  6. 六十四、前缀,后缀,中缀表达式转化求值问题
  7. 转:并发与并行的区别
  8. ElasticSearch filter查询
  9. C++程序的构成和书写形式
  10. xcode 获取模拟器app沙盒路径_使用Xcode12进行App内购测试
  11. 关于科研和工作的几点思考
  12. linux 文件查找
  13. win10c语言乱码修复方法,“字体库异常、电脑乱码的解决方案”的解决方案
  14. 科学研究设计一:什么是科学
  15. 基于EEG的睡眠分期算法记录3-使用决策树多类支持向量机的自动睡眠阶段分类
  16. c语言的二维数组的指针访问,用指针访问二维数组
  17. 页面自动添加font标签
  18. 大神TP_萌新到大神的必修课---分路篇v
  19. lol封号维护服务器,LOL玩家被封三年执着理论,腾讯客服是这样回复的
  20. [朴孝敏][Ooh La La]

热门文章

  1. 自学量化投资之旅-计算股票的复权价
  2. CAN转光纤以太网设备实现CAN网络之间超远距离光纤连通
  3. android system webview diable,微软chromium版Edge浏览器新功能:暗黑模式、WebView2、阅读模式...
  4. 信安第二版:第3章密码学基本理论学习笔记
  5. 什么是α测试?什么是β测试?
  6. 条码打印软件如何制作同时包含日期和流水码的条形码
  7. RF(四则运算及 Evaluate 用法)
  8. 黑客新手基础扫盲贴(上) 黑客基地 黑客传说 黑客帝国 指间的黑客 黑客网站
  9. STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始
  10. 解神者php奥义高阶,《解神者》人物强度排行一览2021 什么人物输出最强