WPF TabControl控件示例
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控件示例相关推荐
- C# WPF TabControl控件用法详解
概述 TabControl我之前有讲过一节,内容详见:C# WPF TabControl用法指南(精品),上节主要讲解了tabcontrol控件的左右翻页,以及页面筛选,以及数据绑定等内容,这节内容继 ...
- WPF 自定义TabControl控件样式(转)
WPF 自定义TabControl控件样式 一.前言 程序中经常会用到TabControl控件,默认的控件样式很普通.而且样式或功能不一定符合我们的要求.比如:我们需要TabControl的标题能够居 ...
- PIE SDK图层树伙伴控件示例
1. 功能简介 TocControl控件的主要作用是显示当前加载的图层有哪些.采用什么样的符号等,目的是使用户对当前加载的数据和结构有一个总体的把握.与之相关联的伙伴控件有MapControl,Pa ...
- 正则表达式——WPF输入控件TextBox 限定输入特定字符
正则表达式--WPF输入控件TextBox 限定输入特定字符 原文:正则表达式--WPF输入控件TextBox 限定输入特定字符 概念: 正则表达式是对字符串操作的一种逻辑公式, 就是用事先定义好的一 ...
- WPF 表格控件 ReoGrid 的简单使用
WPF 表格控件 ReoGrid 的简单使用 目录 一.概述 二.安装 三.添加控件 四.加载 Excel 五.属性设置 六.支持触摸滚动 七.其它操作 1.显示和隐藏列 2.显示特定字体 八.资源链 ...
- OxyPlot.Wpf 图表控件使用备忘
OxyPlot.Wpf 图表控件使用备忘 目录 OxyPlot.Wpf 图表控件使用备忘 一.OxyPlot.Wpf 控件信息 二.基本概念 (一) PlotView 和 Plot (二) PlotM ...
- WPF开源控件扩展库 - MaterialDesignExtensions
WPF开源控件扩展库 - MaterialDesignExtensions MaterialDesignExtensions仓库截图 logo Material Design Extensions 在 ...
- Layui版本的WPF开源控件库-Layui-WPF
大家好,我是沙漠尽头的狼. 今天介绍一款Layui风格的WPF开源控件库,仓库信息如下: 仓库地址:https://github.com/Layui-WPF-Team/Layui-WPF 仓库截图: ...
- C# WPF 歌词控件(支持逐字定位描色效果)
C# WPF 歌词控件(支持逐字定位描色效果) 原文:C# WPF 歌词控件(支持逐字定位描色效果) 之前做了一个模仿网易云歌词的控件,实现了加载网易云歌词并能随音乐播放进度定位歌词.今天呢将在这个控 ...
最新文章
- 有光照就能上网 0.2秒即可下载一部高清电影
- c语言随机函数五位数,【分享代码】弥补c语言随机数不足
- commons-lang StringUtils#split的坑
- 验证输入字符串是否包含特殊字符
- ADS2017打开出现cannot create the directory,解决办法。
- 六十四、前缀,后缀,中缀表达式转化求值问题
- 转:并发与并行的区别
- ElasticSearch filter查询
- C++程序的构成和书写形式
- xcode 获取模拟器app沙盒路径_使用Xcode12进行App内购测试
- 关于科研和工作的几点思考
- linux 文件查找
- win10c语言乱码修复方法,“字体库异常、电脑乱码的解决方案”的解决方案
- 科学研究设计一:什么是科学
- 基于EEG的睡眠分期算法记录3-使用决策树多类支持向量机的自动睡眠阶段分类
- c语言的二维数组的指针访问,用指针访问二维数组
- 页面自动添加font标签
- 大神TP_萌新到大神的必修课---分路篇v
- lol封号维护服务器,LOL玩家被封三年执着理论,腾讯客服是这样回复的
- [朴孝敏][Ooh La La]
热门文章
- 自学量化投资之旅-计算股票的复权价
- CAN转光纤以太网设备实现CAN网络之间超远距离光纤连通
- android system webview diable,微软chromium版Edge浏览器新功能:暗黑模式、WebView2、阅读模式...
- 信安第二版:第3章密码学基本理论学习笔记
- 什么是α测试?什么是β测试?
- 条码打印软件如何制作同时包含日期和流水码的条形码
- RF(四则运算及 Evaluate 用法)
- 黑客新手基础扫盲贴(上) 黑客基地 黑客传说 黑客帝国 指间的黑客 黑客网站
- STM32课程设计--数字时钟+数字电压表+扩展功能--从零开始
- 解神者php奥义高阶,《解神者》人物强度排行一览2021 什么人物输出最强