• WPF自定义TabControl样式


    WPF自定义TabControl,TabControl美化

    XAML代码:

    <TabControl x:Class="SunCreate.Common.Controls.TabControlEx"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:local="clr-namespace:SunCreate.Common.Controls"
                 mc:Ignorable="d" 
                 d:DesignHeight="300" d:DesignWidth="300" SelectionChanged="TabControl_SelectionChanged" >
        <TabControl.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                </ResourceDictionary.MergedDictionaries>
                <!--菜单样式-->
                <ControlTemplate x:Key="menuTemplate" TargetType="ContextMenu">
                    <Border Name="bd" Background="#99001133">
                        <ItemsPresenter/>
                    </Border>
                </ControlTemplate>
                <ControlTemplate x:Key="menuSeperatorTemplate" TargetType="Separator">
                    <Border Background="#6fff">
                    </Border>
                </ControlTemplate>
                <ControlTemplate x:Key="menuItemTemplate" TargetType="MenuItem">
                    <Border Name="bd" Height="30" Background="Transparent">
                        <StackPanel Orientation="Horizontal">
                            <Image x:Name="img" Stretch="None" Margin="10,0,10,0" Source="/SunCreate.Common.Controls;Component/Images/Controls/二级菜单左箭头.png"></Image>
                            <TextBlock x:Name="tb" Margin="0,0,10,0" Foreground="#fff" VerticalAlignment="Center" Text="{Binding Header, RelativeSource={RelativeSource TemplatedParent}}"/>
                        </StackPanel>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="bd" Property="Background" Value="#99001133" />
                            <Setter TargetName="tb" Property="Foreground" Value="#ff5e5e" />
                            <Setter TargetName="tb" Property="Margin" Value="0,0,9,0" />
                            <Setter TargetName="img" Property="Source" Value="/SunCreate.Common.Controls;Component/Images/Controls/左箭头_选中.png"></Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </ResourceDictionary>
        </TabControl.Resources>
        <TabControl.Template>
            <ControlTemplate TargetType="TabControl" >
                <ControlTemplate.Resources>
                    <Style TargetType="TabItem">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="TabItem">
                                    <Grid x:Name="gridTabItem" Tag="{Binding ElementName=tabCloseBtn}" HorizontalAlignment="Center" MouseLeftButtonDown="tabItem_MouseLeftButtonDown" MouseRightButtonUp="tabItem_MouseRightButtonUp" >
                                        <Grid.ColumnDefinitions>
                                            <ColumnDefinition></ColumnDefinition>
                                            <ColumnDefinition></ColumnDefinition>
                                            <ColumnDefinition Width="16"></ColumnDefinition>
                                            <ColumnDefinition></ColumnDefinition>
                                        </Grid.ColumnDefinitions>
                                        <Path x:Name="pathLeft" Height="4" Width="5" Data="M 0,4 L 5,4 5,0 C 5,0 5,4 0,4 Z" Fill="#096691" StrokeThickness="0" VerticalAlignment="Bottom" Visibility="Collapsed" SnapsToDevicePixels="True" >
                                        </Path>
                                        <Path x:Name="pathRight" Height="4" Width="5" Data="M 0,0 L 0,4 5,4 C 5,4 0,4 0,0 Z" Grid.Column="3" Fill="#096691" StrokeThickness="0" VerticalAlignment="Bottom" Visibility="Collapsed" SnapsToDevicePixels="True" >
                                        </Path>
                                        <Border x:Name="bdText" Grid.Column="1" Margin="0 0 0 0" Background="#096691" CornerRadius="3 0 0 0" SnapsToDevicePixels="True" >
                                            <TextBlock x:Name="txt" Margin="15 0 10 0" FontSize="12" Foreground="#fff" FontFamily="微软雅黑,黑体" Text="{TemplateBinding Header}" VerticalAlignment="Center"></TextBlock>
                                        </Border>
                                        <Border x:Name="bdBtn" Grid.Column="2" Margin="0 0 0 0" Background="#096691" CornerRadius="0 3 0 0" SnapsToDevicePixels="True" >
                                        </Border>
                                        <Button x:Name="btnTabItemClose" Grid.Column="2" Width="7" Height="7" HorizontalAlignment="Right" Click="btnTabItemClose_Click" VerticalAlignment="Top"  Margin="0,5,5,0">
                                            <Button.Template>
                                                <ControlTemplate TargetType="{x:Type Button}">
                                                    <Border Background="Transparent">
                                                        <Image Stretch="Fill" x:Name="imgTabClose" Source="/SunCreate.Common.Controls;Component/Images/Controls/菜单关闭.png" ></Image>
                                                    </Border>
                                                    <ControlTemplate.Triggers>
                                                        <Trigger Property="IsPressed" Value="true">
                                                            <Setter TargetName="imgTabClose"  Property="Margin" Value="1"></Setter>
                                                        </Trigger>
                                                        <Trigger Property="IsMouseOver" Value="true">
                                                            <Setter TargetName="imgTabClose"  Property="Margin" Value="1"></Setter>
                                                        </Trigger>
                                                    </ControlTemplate.Triggers>
                                                </ControlTemplate>
                                            </Button.Template>
                                        </Button>
                                    </Grid>
                                    <ControlTemplate.Triggers>
                                        <Trigger Property="IsSelected" Value="true">
                                            <Setter TargetName="bdText" Property="Background" Value="#012f3f"></Setter>
                                            <Setter TargetName="bdBtn" Property="Background" Value="#012f3f"></Setter>
                                            <Setter TargetName="pathLeft" Property="Fill" Value="#012f3f"></Setter>
                                            <Setter TargetName="pathRight" Property="Fill" Value="#012f3f"></Setter>
                                            <Setter TargetName="pathLeft" Property="Visibility" Value="Visible"></Setter>
                                            <Setter TargetName="pathRight" Property="Visibility" Value="Visible"></Setter>
                                            <Setter TargetName="gridTabItem" Property="Margin" Value="0 0 -8 0"></Setter>
                                        </Trigger>
                                        <Trigger Property="IsSelected" Value="false">
                                            <Setter TargetName="gridTabItem" Property="Margin" Value="5 0 -3 0"></Setter>
                                            <Setter TargetName="txt" Property="Foreground" Value="#78a7c1"></Setter>
                                        </Trigger>
                                        <Trigger Property="IsMouseOver" Value="true">
                                            <Setter TargetName="txt" Property="Foreground" Value="#f2f5f7"/>
                                        </Trigger>
                                    </ControlTemplate.Triggers>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ControlTemplate.Resources>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="26"></RowDefinition>
                        <RowDefinition Height="1*"></RowDefinition>
                    </Grid.RowDefinitions>
                    <Border>
                        <StackPanel MinWidth="{TemplateBinding Property=ActualWidth}" Orientation="Horizontal" Margin="2,0,0,0" IsItemsHost="True"></StackPanel>
                    </Border>
                    <Border Grid.Row="1" Background="#012f3f" CornerRadius="2" >
                        <ContentPresenter  Content="{TemplateBinding Property=SelectedContent }">
                        </ContentPresenter>
                    </Border>
                </Grid>
            </ControlTemplate>
        </TabControl.Template>
        <TabControl.ContextMenu>
            <ContextMenu Name="menu" Template="{StaticResource menuTemplate}">
                <MenuItem Header="关闭标签" Template="{StaticResource menuItemTemplate}" CommandParameter="0" Click="menuItemClick"></MenuItem>
                <Separator Height="1" Template="{StaticResource menuSeperatorTemplate}" Margin="1 0 1 0"></Separator>
                <MenuItem Header="关闭其他标签" Template="{StaticResource menuItemTemplate}" CommandParameter="1" Click="menuItemClick"></MenuItem>
                <MenuItem Header="关闭左侧标签" Template="{StaticResource menuItemTemplate}" CommandParameter="2" Click="menuItemClick"></MenuItem>
                <MenuItem Header="关闭右侧标签" Template="{StaticResource menuItemTemplate}" CommandParameter="3" Click="menuItemClick"></MenuItem>
            </ContextMenu>
        </TabControl.ContextMenu>
    </TabControl>
    View Code

    C#代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Controls.Primitives;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace SunCreate.Common.Controls
    {
        /// <summary>
        /// TabControl控件封装
        /// </summary>
        public partial class TabControlEx : TabControl
        {
            /// <summary>
            /// TabItem右键菜单源
            /// </summary>
            private TabItem _contextMenuSource;
    
            public TabControlEx()
            {
                InitializeComponent();
            }
    
            private void tabItem_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
            {
    
            }
    
            private void tabItem_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
            {
                _contextMenuSource = (sender as Grid).TemplatedParent as TabItem;
                this.menu.PlacementTarget = sender as Grid;
                this.menu.Placement = PlacementMode.MousePoint;
                this.menu.IsOpen = true;
            }
    
            #region TabItem右键菜单点击事件
            private void menuItemClick(object sender, RoutedEventArgs e)
            {
                MenuItem btn = e.Source as MenuItem;
                int data = Convert.ToInt32(btn.CommandParameter.ToString());
    
                if (_contextMenuSource != null)
                {
                    List<TabItem> tabItemList = new List<TabItem>();
                    if (data == 0)
                    {
                        tabItemList.Add(_contextMenuSource);
                    }
                    if (data == 1)
                    {
                        for (int i = 0; i < this.Items.Count; i++)
                        {
                            TabItem tabItem = this.Items[i] as TabItem;
                            if (tabItem != _contextMenuSource)
                            {
                                tabItemList.Add(tabItem);
                            }
                        }
                    }
                    if (data == 2)
                    {
                        for (int i = 0; i < this.Items.Count; i++)
                        {
                            TabItem tabItem = this.Items[i] as TabItem;
                            if (tabItem != _contextMenuSource)
                            {
                                tabItemList.Add(tabItem);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                    if (data == 3)
                    {
                        for (int i = this.Items.Count - 1; i >= 0; i--)
                        {
                            TabItem tabItem = this.Items[i] as TabItem;
                            if (tabItem != _contextMenuSource)
                            {
                                tabItemList.Add(tabItem);
                            }
                            else
                            {
                                break;
                            }
                        }
                    }
                    foreach (TabItem tabItem in tabItemList)
                    {
                        CloseTabItem(tabItem);
                    }
                }
            }
            #endregion
    
            private void btnTabItemClose_Click(object sender, RoutedEventArgs e)
            {
                var btn = sender as Button;
                var tmplParent = (btn.Parent as Grid).TemplatedParent;
                var tabItem = tmplParent as TabItem;
                CloseTabItem(tabItem);
            }
    
            #region 关闭TabItem
            /// <summary>
            /// 关闭TabItem
            /// </summary>
            private void CloseTabItem(TabItem tabItem)
            {
                if (tabItem.Content is WorkSpaceContent)
                {
                    var content = tabItem.Content as WorkSpaceContent;
                    if (content != null)
                    {
                        content.Disposed();
                    }
                    tabItem.Content = null;
                    content = null;
                }
                this.Items.Remove(tabItem);
            }
            #endregion
    
            private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
            {
                foreach (TabItem tabItem in e.RemovedItems)
                {
                    Panel.SetZIndex(tabItem, 99);
                }
                foreach (TabItem tabItem in e.AddedItems)
                {
                    Panel.SetZIndex(tabItem, 999);
                }
            }
    
        }
    }
    View Code

    效果图:

  • 相关阅读:
    插槽分发内容
    Java学习-sgg-day07-20200422-复习
    Java学习-sgg-day06-20200421-今天晚上在下载资料
    Java学习-sgg-day05-20200420
    Java学习之面向对象之总结-sgg-day04-20200419
    Java学习之Eclipse的使用-sgg-day04-20200419
    Java学习之面向对象-sgg-day04-20200419
    Java学习之面向对象-sgg-day03-20200418
    Java学习总结-前三天
    Java学习之-sgg-day03-20200418
  • 原文地址:https://www.cnblogs.com/s0611163/p/9994594.html
Copyright © 2020-2023  润新知