WPF自定义TabControl样式

WPF自定义TabControl样式
原文: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);}}}#endregionprivate 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);}#endregionprivate 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

效果图:

 

posted on 2019-04-02 11:38 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10641641.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H.264分层结构与码流结构

H.264分层结构 H.264编码器输出的Bit流中&#xff0c;每个Bit都隶属于某个句法元素。句法元素被组织成有层次的结构&#xff0c;分别描述各个层次的信息。 在H.264 中&#xff0c;句法元素共被组织成 序列、图像、片、宏块、子宏块五个层次。在这样的结构中&#xff0c;每一层…

20个很酷的CSS3导航菜单制作教程

CSS3 是对 CSS 规范的一个很大的改善和增强&#xff0c;它使得 Web 开发人员可以很容易的在网站中加入时尚的效果。以前很多需要编写 JavaScript 才能实现的效果&#xff0c;如今只需要简单的写几句 CSS3 代码就能实现。今天这篇文章就向大家推荐20个很酷的CSS3导航菜单制作教程…

金算盘高手论坛资料中心_3D006期 菜鸟论坛精英PK专栏 速来围观!!

点上方“菜鸟选号论坛”→点右上角“...”→选“星标★”每日上午更新&#xff0c;星标置顶与大神不走散苹果是置顶&#xff0c;安卓是星标 点击"菜鸟选号论坛"关注我们论坛明星版块&#xff0c;集全网各路高手之大乘&#xff0c;打造草根明星 展示舞台。同时主要是为…

非常酷!10个基于 HTML5 的字体应用演示网站

HTML5 是现在Web开发领域的热点&#xff0c;更多的开发人员开始使用HTML5来开发交互性强、效果出众的网站和各种应用。这是 HTML5 网站大观系列第四篇&#xff0c;本文与大家分享5个非常酷的基于 HTML5 的字体应用演示网站&#xff0c;一起欣赏。 Web Typography For The Lone…

ntp如何确认与服务器偏差_LED电子时钟显示屏如何实现时间同步统一校时?

LED电子时钟显示屏采用一体式铝合金边框设计&#xff0c;更坚固美观节能环保&#xff0c;更以其简单的操作和稳定的性能&#xff0c;广泛应用于学校、考场、医院、金融、移动通信、石油、电力、交通、工业以及国防等同步时钟系统的显示终端&#xff0c;LED电子时钟显示屏已成为…

HDP 2.6 requires libtirpc-devel

HDP 2.6 requires libtirpc-devel 个问题&#xff0c;截止 Mustafa Kemal MAYUK 2017年06月30日 06:30 hadoopPowerSystemsHello, I am trying to install HDP 2.6 on RHEL 7.2 ppc64le. Installation over ambari fails due to "Error: Package: hadoop_2_6_0_3_8-hdfs-2…

推荐10款非常有用的 Ajax 插件

这篇文章与大家分享的是10款非常有用的 Ajax 插件&#xff0c;有用于图片的&#xff0c;用于分页的&#xff0c;还有用于导航的。这些作者的想法特别新颖&#xff0c;希望你能从中找到自己需要的插件。 1. AJAX-ZOOM 非常强大的一款插件&#xff0c;可用鼠标滚轮进行缩放&…

svgaps绘制时不能用中文命名吗_设计师需要了解的切图命名规范

2020年8月21日下午4点50分 黄河公园通常我们在界面设计完成之后要切图给到前端开发。初做UI设计时&#xff0c;把重点都放在设计效果图上&#xff0c;对之后的切图命名规范没有很注重。当时我会有一些疑惑&#xff0c;切图命名的原则是什么&#xff1f;直接命名为能表达清楚的名…

分享20个漂亮的DIV CSS标准化站点案例

看到有些网站的代码十分优雅&#xff0c;心想自己什么时候也能写出这么好的代码。其实&#xff0c;这不是一朝一夕能达到的&#xff0c;需要的实践中不断锤炼和提高。我们可以通过分析别人写得好的网页代码来更加快速的提高自己&#xff0c;下面向大家推荐20个基于DIV CSS标准布…

在单独的WAR组件中对SPA资源和API实现进行分区

单页应用程序正Swift吸引人们的注意力&#xff0c;以实现基于Web的丰富&#xff0c;健壮和移动友好的应用程序。 本质上&#xff0c;这需要改变应用程序体系结构&#xff0c;其中整个应用程序用户界面是使用JavaScript来实现的&#xff0c;而服务器端代码则为服务器端应用程序逻…

上传文件显示进度条_【技巧 】iOSamp;Windows互传文件?透过「文件」轻松解决~...

苹果家的隔空投送能做到手机、电脑间的无缝衔接&#xff1b;在iOS13的「文件」中加入了局域网的文件共享功能&#xff0c;电脑不需要安装任何软件&#xff0c;实现 iPhone 与 Windows 电脑间文件的共享、传输。注意&#xff1a;本文介绍的是基于局域网&#xff08;同一路由器&a…

在Window上使用Jenkins自动部署和上传快照Java工件

这篇文章将展示如何使用Jenkins Continuous Integration自动执行Java Web应用程序&#xff08;使用MYSQL DB和基于Hibernate ORM在基于REST的Jersey2 Spring环境中开发的学生申请应用程序&#xff09;的部署过程-生成项目&#xff0c;运行单元测试&#xff0c;上传构建的工件到…

10个在线Web设计开发工具介绍

1. 在线文本生成器 BlindTextGenerator&#xff1a;对设计师来说&#xff0c;这是一个简单又好用的文本生成小工具。内含许多种字体&#xff0c;可设置字符的大小&#xff0c;数量&#xff0c;样式&#xff0c;段落的数量及对齐方式等&#xff0c;还可以很方便且精确地调节文本…

获取clientheight为0_用10行python代码获取全国城市交通生活圈

今天在网上冲浪看到一个很花哨的数据&#xff0c;全国各城市主要商圈从早上6点到晚上10点的20min&#xff0c;30min,45min,60min,90min生活圈轮廓。1 获取思路按下F12按下F12&#xff0c;点击淮海路可以看到出现一个网站&#xff0c;他就是我们要找的接口接口内容是通过get请求…

12个便于web设计及开发的在线工具

请不要低估这些小工具&#xff0c;他们极其的方便并且能节省很多的时间和工作&#xff0c;下面就是这些在线工具的列表&#xff0c;挑几款来试试吧。 我还是比较喜欢Ajax Load和Web 20 Badges Generator的&#xff0c;你们呢&#xff1f; Favico 一个图标制作工具&#xff0c…

服务器改家用系统吗,服务器主机改家用

服务器主机改家用 内容精选换一换本节操作介绍购买云耀云服务器的操作步骤。购买时&#xff0c;为减少您配置参数的时间&#xff0c;部分参数由系统自动分配&#xff0c;以下参数配置供你了解系统的默认配置。购买云耀云服务器仅支持“包年/包月”的计费方式&#xff0c;请您在…

指定module_一个缺失已久的特性 — module模块

在ES6之前&#xff0c;Javascript还不支持原生的模块化。如果要实现模块化&#xff0c;我们要借助一些框架&#xff0c;比如&#xff1a;requireJS或者seaJS等&#xff1b;什么&#xff1f;没用过也没听过这些框架&#xff1f;没关系&#xff0c;它们不是我们今天要讲的重点。今…

使用HTML5,画布和开放数据创建全球降水(雨)可视化

我目前正在为Three.js编写下一本书&#xff0c;其中一章涉及可视化开放数据。 在寻找可以使用的数据时&#xff0c;我遇到了来自NOAA的一组数据。 通过此站点&#xff0c;您可以以网格格式下载一组全世界的每月降水报告。 因此&#xff0c;我下载了它们&#xff0c;然后开始处理…

CRF两个例子的理解

概率计算例子&#xff1a; 预测例子&#xff1a; 转载于:https://www.cnblogs.com/callyblog/p/9933993.html

【转】前端开发值得一看的文章

其实这篇文章不是这里的&#xff0c;只是&#xff0c;后台很傻B地进不了了。也不知道是什么乱七八糟的问题。先写在这里&#xff0c;当做这么久没更新的偷懒好了。&#xff08;而且&#xff0c;挑出来的这些都是精华呢!&#xff09;&#xff0c;大家各取所需吧&#xff1a; 1. …