自定义滚动条(Custom ScrollBar)

时间如流水,只能流去不流回! 

点赞再看,养成习惯,这是您给我创作的动力! 

本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform、WPF、ASP.NET Core等,亦有C++桌面相关的Qt Quick和Qt Widgets等,只分享自己熟悉的、自己会的。

Dotnet9.com

阅读导航:

  • 一、先看效果

  • 二、本文背景

  • 三、代码实现

  • 四、文章参考

  • 五、代码下载

一、先看效果

二、本文背景

设计师给的效果图中,滚动条的样式好好看呀,但是手上现有的控件库不好改呀,那我自己重新实现样式吧。

三、代码实现

小编使用.Net Core 3.1创建的WPF工程,创建名称为“ScrollBar”的解决方案后,不添加任何用户控件,直接在MainWindow.xaml文件中开干。

下面是上图显示的窗体标题及滚动视图代码:

<Grid Background="#FF222222"><Grid.RowDefinitions><RowDefinition Height="60"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid Grid.Row="0"><TextBlock Margin="10" Text="Custom ScrollBar" Foreground="#FFEEEEEE" FontSize="33" FontFamily="Script MT Bold" VerticalAlignment="Center"/></Grid><ScrollViewer Grid.Row="1"><Grid Height="1000"/></ScrollViewer></Grid>

下面是上面未添加样式时代码的效果:

除了标题还看得过去,滚动条丑到爆有木有?下面开始添加样式,即覆盖滚动条默认的样式:

<Window.Resources><ResourceDictionary><Style x:Key="ScrollThumbs" TargetType="{x:Type Thumb}"><Setter Property="Template"><Setter.Value><ControlTemplate><Grid x:Name="Grid"><Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto"Height="Auto" Fill="Transparent"/><Border x:Name="Rectangle1" CornerRadius="10 0 0 10" HorizontalAlignment="Stretch"VerticalAlignment="Stretch" Width="Auto" Height="Auto"Background="{TemplateBinding Background}"/></Grid><ControlTemplate.Triggers><Trigger Property="Tag" Value="Horizontal"><Setter TargetName="Rectangle1" Property="Width" Value="Auto"/><Setter TargetName="Rectangle1" Property="Height" Value="7"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><!--SCROLLBARS--><Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}"><Setter Property="Stylus.IsFlicksEnabled" Value="False"/><Setter Property="Foreground" Value="#AAA8341A"/><Setter Property="Background" Value="DarkGray"/><Setter Property="Width" Value="10"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type ScrollBar}"><Grid x:Name="GridRoot" Width="12" Background="{x:Null}"><Track x:Name="PART_Track" Grid.Row="0" IsDirectionReversed="True" Focusable="False"><Track.Thumb><Thumb x:Name="Thumb" Background="{TemplateBinding Foreground}"Style="{DynamicResource ScrollThumbs}"/></Track.Thumb><Track.IncreaseRepeatButton><RepeatButton x:Name="PageUp" Command="ScrollBar.PageUpCommand" Opacity="0" Focusable="True"/></Track.IncreaseRepeatButton><Track.DecreaseRepeatButton><RepeatButton x:Name="PageDown" Command="ScrollBar.PageDownCommand" Opacity="0" Focusable="True"/></Track.DecreaseRepeatButton></Track></Grid><ControlTemplate.Triggers><Trigger SourceName="Thumb" Property="IsMouseOver" Value="True"><Setter Value="{DynamicResource ButtonSelectBrush}"TargetName="Thumb" Property="Background"/></Trigger><Trigger SourceName="Thumb" Property="IsDragging" Value="True"><Setter Value="{DynamicResource DarkBrush}"TargetName="Thumb" Property="Background"/></Trigger><Trigger Property="IsEnabled" Value="False"><Setter TargetName="Thumb" Property="Visibility" Value="Collapsed"/></Trigger><Trigger Property="Orientation" Value="Horizontal"><Setter TargetName="GridRoot" Property="LayoutTransform"><Setter.Value><RotateTransform Angle="-90"/></Setter.Value></Setter><Setter TargetName="PART_Track" Property="LayoutTransform"><Setter.Value><RotateTransform Angle="-90"/></Setter.Value></Setter><Setter Property="Width" Value="Auto"/><Setter Property="Height" Value="12"/><Setter TargetName="Thumb" Property="Tag" Value="Horizontal"/><Setter TargetName="PageDown" Property="Command" Value="ScrollBar.PageLeftCommand"/><Setter TargetName="PageUp" Property="Command" Value="ScrollBar.PageRightCommand"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary></Window.Resources>

下面是整个MainWindow.xaml的代码,您直接copy到您的测试工程中就可以用了:

<Window x:Class="ScrollBar.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:ScrollBar"mc:Ignorable="d"Title="MainWindow" Height="450" Width="300" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" WindowStyle="None"><Window.Resources><ResourceDictionary><Style x:Key="ScrollThumbs" TargetType="{x:Type Thumb}"><Setter Property="Template"><Setter.Value><ControlTemplate><Grid x:Name="Grid"><Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto"Height="Auto" Fill="Transparent"/><Border x:Name="Rectangle1" CornerRadius="10 0 0 10" HorizontalAlignment="Stretch"VerticalAlignment="Stretch" Width="Auto" Height="Auto"Background="{TemplateBinding Background}"/></Grid><ControlTemplate.Triggers><Trigger Property="Tag" Value="Horizontal"><Setter TargetName="Rectangle1" Property="Width" Value="Auto"/><Setter TargetName="Rectangle1" Property="Height" Value="7"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style><!--SCROLLBARS--><Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}"><Setter Property="Stylus.IsFlicksEnabled" Value="False"/><Setter Property="Foreground" Value="#AAA8341A"/><Setter Property="Background" Value="DarkGray"/><Setter Property="Width" Value="10"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="{x:Type ScrollBar}"><Grid x:Name="GridRoot" Width="12" Background="{x:Null}"><Track x:Name="PART_Track" Grid.Row="0" IsDirectionReversed="True" Focusable="False"><Track.Thumb><Thumb x:Name="Thumb" Background="{TemplateBinding Foreground}"Style="{DynamicResource ScrollThumbs}"/></Track.Thumb><Track.IncreaseRepeatButton><RepeatButton x:Name="PageUp" Command="ScrollBar.PageUpCommand" Opacity="0" Focusable="True"/></Track.IncreaseRepeatButton><Track.DecreaseRepeatButton><RepeatButton x:Name="PageDown" Command="ScrollBar.PageDownCommand" Opacity="0" Focusable="True"/></Track.DecreaseRepeatButton></Track></Grid><ControlTemplate.Triggers><Trigger SourceName="Thumb" Property="IsMouseOver" Value="True"><Setter Value="{DynamicResource ButtonSelectBrush}"TargetName="Thumb" Property="Background"/></Trigger><Trigger SourceName="Thumb" Property="IsDragging" Value="True"><Setter Value="{DynamicResource DarkBrush}"TargetName="Thumb" Property="Background"/></Trigger><Trigger Property="IsEnabled" Value="False"><Setter TargetName="Thumb" Property="Visibility" Value="Collapsed"/></Trigger><Trigger Property="Orientation" Value="Horizontal"><Setter TargetName="GridRoot" Property="LayoutTransform"><Setter.Value><RotateTransform Angle="-90"/></Setter.Value></Setter><Setter TargetName="PART_Track" Property="LayoutTransform"><Setter.Value><RotateTransform Angle="-90"/></Setter.Value></Setter><Setter Property="Width" Value="Auto"/><Setter Property="Height" Value="12"/><Setter TargetName="Thumb" Property="Tag" Value="Horizontal"/><Setter TargetName="PageDown" Property="Command" Value="ScrollBar.PageLeftCommand"/><Setter TargetName="PageUp" Property="Command" Value="ScrollBar.PageRightCommand"/></Trigger></ControlTemplate.Triggers></ControlTemplate></Setter.Value></Setter></Style></ResourceDictionary></Window.Resources><Grid Background="#FF222222"><Grid.RowDefinitions><RowDefinition Height="60"/><RowDefinition Height="*"/></Grid.RowDefinitions><Grid Grid.Row="0"><TextBlock Margin="10" Text="Custom ScrollBar" Foreground="#FFEEEEEE" FontSize="33" FontFamily="Script MT Bold" VerticalAlignment="Center"/></Grid><ScrollViewer Grid.Row="1"><Grid Height="1000"/></ScrollViewer></Grid>
</Window>

四、文章参考

参考:
Design com WPF :     https://www.youtube.com/watch?v=aQeXth-1B0I&t=350s

五、代码下载

文章中代码已经全部贴出,自定义滚动条,主要是改变滚动条的Track样式,也即Track的Thumb、IncreaseRepeatButton、DecreaseRepeatButton三个成员的样式,您get到了吗?

除非注明,文章均由 Dotnet9 整理发布,欢迎转载。 

转载请注明本文地址:https://dotnet9.com/2019/12/it-technology/csharp/wpf/custom-scrollbar.html

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

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

相关文章

用ASP.NET Core构建可检测的高可用服务--学习笔记

摘要随着现代化微服务架构的发展&#xff0c;系统故障的定位与快速恢复面临着诸多挑战&#xff0c;构建可检测的服务&#xff0c;帮助线上保障团队时刻掌控应用的运行状况越来越重要。本次分享会讲解如何让 ASP .NET Core 应用与现代化云基础设施完美融合&#xff0c;提升服务的…

[功能发布]Excel催化剂2周年巨献-网页数据采集功能发布,满足90%合理场景使用...

转眼间&#xff0c;Excel催化剂推出已经两周年&#xff0c;在此之际&#xff0c;献上数据时代最刚需的网页采集功能&#xff0c;无需苦苦寻觅各种工具&#xff0c;借助Excel催化剂过往数据处理、清洗功能&#xff0c;加上此轮的网页采集功能&#xff0c;一点不输于市面上的各种…

.NET Core 微服务学习与实践系列文章目录索引(2019版)

Photo &#xff1a;.NET Core文 | Edison Zhou2018年&#xff0c;我开始学习和实践.NET Core&#xff0c;并开始了微服务的学习&#xff0c;以及通过各种开源组件搭建服务治理技术方案&#xff0c;并在学习过程中总结了一个.NET Core微服务学习与实践系列文章&#xff0c;涵盖了…

dapr微服务.net sdk入门

Actors入门先决条件.Net Core SDK 3.0Dapr CLIDapr DotNet SDK概述本文档描述如何在客户端应用程序上创建Actor&#xff08;MyActor&#xff09;并调用其方法.MyActor --- MyActor.Interfaces|- MyActorService|- MyActorClient接口项目&#xff08;\MyActor\MyActor.Interface…

TPL Dataflow组件应对高并发,低延迟要求

长话短说2C互联网业务增长&#xff0c;单机多核的共享内存模式带来的排障问题、编程困难&#xff1b;随着多核时代和分布式系统的到来&#xff0c;共享模型已经不太适合并发编程&#xff0c;因此actor-based模型又重新受到了人们的重视。---------------------------调试过多线…

abp模块生命周期设计思路剖析

abp中将生命周期事件抽象为4个接口&#xff1a;//预初始化 public interface IOnPreApplicationInitialization {void OnPreApplicationInitialization([NotNull] ApplicationInitializationContext context); }//初始化 public interface IOnApplicationInitialization {void …

.Net Core + 微信赋能企业级智能客服系统--学习笔记

摘要围绕目前需求猛增的微信及移动端企业智能客服业务&#xff0c;利用 .NET Core 的一系列优秀特性及 SignalR 模块打造全双工、跨微信/QQ/钉钉等应用平台、跨系统平台、跨终端、支持企业级并发的移动端客服系统。讲师介绍目录微信应用生态简介微信小程序基础通讯原理Senparc.…

基于docker-compose的Gitlab CI/CD实践排坑指南

长话短说经过长时间实操验证&#xff0c;终于完成基于Gitlab的CI/CD实践&#xff0c;本次实践的坑位很多&#xff0c; 实操过程尽量接近最佳实践&#xff08;不做hack, 不做骚操作&#xff09;&#xff0c;记录下来加深理解。看过博客园《docker-compose真香》一文的园友留意到…

Is It a Complete AVL Tree AVL树

思路&#xff1a; 考察的点是建立AVL树以及如何判断是否为满二叉树。 建立AVL树需要搞清楚LL、LR、RR、RL四种情况如何左旋和右旋&#xff0c;如下&#xff1a; 类型BF条件操作LLBF(root)2,BF(root->lchild)1root右旋LRBF(root)2,BF(root->lchild)-1先root->lchild左…

AcWing 删减 栈思想

思路&#xff1a; 这道题要是不卡时间复杂度&#xff0c;是道大水题&#xff0c;然而字符串的长度到了6次方&#xff0c;若使用string中的erase函数&#xff0c;看似时间复杂度不高&#xff0c;其实&#xff0c;每次删除子字符串后&#xff0c;后边的字符串需要移动到前面来&am…

读《可复制的领导力》

最近很忙&#xff0c;是特别忙&#xff0c;连上厕所的时间都在回复着各种消息&#xff0c;但还是挤时间看完了《可复制的领导力》&#xff0c;这本书也是领导推荐的。说起领导力&#xff0c;大多数人都会觉得得靠悟&#xff0c;并不能做到言传身教&#xff0c;但书名中却提到了…

AcWing 构造数组 区间合并

思路&#xff1a; 这道题第一眼来看以为是动态规划类型的题目&#xff0c;然而尝试了用dp的方法做&#xff0c;然而超时了&#xff0c;过了差不多一半的测试店&#xff0c;显示的是超时。那么应该来说动态规划是可以做的&#xff0c;但数据卡的比较严。在看其他同学的评论后&am…

为什么需要动态SQL

为什么需要动态SQL在使用 EF或者写 SQL语句时&#xff0c;查询条件往往是这样一种非常常见的逻辑&#xff1a;如果客户填了查询信息&#xff0c;则查询该条件&#xff1b;如果客户没填&#xff0c;则返回所有数据。我常常看到很多人解决这类问题时使用了错误的静态 SQL的解决办…

【好文】为什么必须学好.Net Core?怎样弯道超车新年高薪?这样做,一周就够了!(文末彩蛋)...

都2020了你还不会.Net Core&#xff1f;恕我直言&#xff0c;2020年还不会.Net Core是会被淘汰的&#xff01;12月3号&#xff0c;.Net Core3.1的LTS版正式发布&#xff0c;4年来7个正式版本和几十个Preview版本&#xff0c;热烈可见一斑&#xff01;越来越多的互联网软件公司开…

基于 Kubernetes 的基础设施即代码

11 月 9、10 号两天&#xff0c;.NET 社区第一次以“.NET 大会”为品牌在上海召开了第一届峰会&#xff0c;现场与会者达到 600 人规模。大会的第 1 天是各类演讲分享&#xff0c;第 2 天有多个动手实践课。张善友队长、 刘腾飞 和我一起策划了基于 Kubernetes 的 .NET Core 微…

Steeltoe 2.4新增代码生成工具、全新入门指南等,助力.NET微服务开发

Steeltoe框架现可帮助.NET开发人员创建云原生应用。随着其功能的扩充&#xff0c;该框架越来越受欢迎&#xff0c;下载量达到580万&#xff08;并且仍在增加&#xff09;&#xff0c;这其中大部分的功能创新都源自于用户反馈、社区贡献和.NET运行环境各方面的改进。但这些还不够…

2019 年终回顾:不忘初心,负重前行

点击上方蓝字关注“汪宇杰博客”导语2019 年就要接近尾声&#xff0c;这一年对于我来说&#xff0c;有许多有意义的事件。我成长了许多&#xff0c;并依然保持着对技术的热情。在辞旧迎新之际&#xff0c;我想回顾一下我这一年中有意义的事件与收获&#xff0c;期待与大家一起在…

【C#】设计模式的学习征途系列文章目录(2019版)

Photo &#xff1a;Design Patterns文 | Edison Zhou2017年&#xff0c;我开始系统学习设计模式&#xff0c;参考了《大话设计模式》、《设计模式的艺术》等书籍&#xff0c;并通过C#语言写了各种模式的代码示例&#xff08;已经放到了我的github上并收获了120个star&#xff0…

原创 | 为什么年终奖是一个彻头彻尾的职场圈套?

0前言之前写过几篇职场专题的文章&#xff0c;反响不错&#xff0c;也先后被不少公众号转载过&#xff0c;这几天来了不少新朋友&#xff0c;如果之前没阅读过&#xff0c;可以在后台回复“职场”2个字&#xff0c;查看系列文章。转眼又到年底了&#xff0c;不知道有多少人在心…

Blazor 机制初探以及什么是前后端分离,还不赶紧上车?

上一篇文章发了一个 BlazAdmin 的尝鲜版基于 Blazui 的 Blazor 后台管理模板 BlazAdmin 正式尝鲜&#xff0c;这一次主要聊聊 Blazor 是如何做到用 C# 来写前端的&#xff0c;传送门&#xff1a;https://www.cnblogs.com/wzxinchen/p/12057171.html飚车前需要说明的一点是&…