自定义滚动条(Custom ScrollBar)

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

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

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

阅读导航:

  • 一、先看效果
  • 二、本文背景
  • 三、代码实现
  • 四、文章参考
  • 五、代码下载

一、先看效果

二、本文背景

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

三、代码实现

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

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

 1 <Grid Background="#FF222222">
 2         <Grid.RowDefinitions>
 3             <RowDefinition Height="60"/>
 4             <RowDefinition Height="*"/>
 5         </Grid.RowDefinitions>
 6         <Grid Grid.Row="0">
 7             <TextBlock Margin="10" Text="Custom ScrollBar" Foreground="#FFEEEEEE" FontSize="33" FontFamily="Script MT Bold" VerticalAlignment="Center"/>
 8         </Grid>
 9         <ScrollViewer Grid.Row="1">
10             <Grid Height="1000"/>
11         </ScrollViewer>
12     </Grid>

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

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

 1 <Window.Resources>
 2         <ResourceDictionary>
 3             <Style x:Key="ScrollThumbs" TargetType="{x:Type Thumb}">
 4                 <Setter Property="Template">
 5                     <Setter.Value>
 6                         <ControlTemplate>
 7                             <Grid x:Name="Grid">
 8                                 <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto"
 9                                            Height="Auto" Fill="Transparent"/>
10                                 <Border x:Name="Rectangle1" CornerRadius="10 0 0 10" HorizontalAlignment="Stretch"
11                                         VerticalAlignment="Stretch" Width="Auto" Height="Auto"
12                                         Background="{TemplateBinding Background}"/>
13                             </Grid>
14                             <ControlTemplate.Triggers>
15                                 <Trigger Property="Tag" Value="Horizontal">
16                                     <Setter TargetName="Rectangle1" Property="Width" Value="Auto"/>
17                                     <Setter TargetName="Rectangle1" Property="Height" Value="7"/>
18                                 </Trigger>
19                             </ControlTemplate.Triggers>
20                         </ControlTemplate>
21                     </Setter.Value>
22                 </Setter>
23             </Style>
24
25             <!--SCROLLBARS-->
26             <Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
27                 <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
28                 <Setter Property="Foreground" Value="#AAA8341A"/>
29                 <Setter Property="Background" Value="DarkGray"/>
30                 <Setter Property="Width" Value="10"/>
31                 <Setter Property="Template">
32                     <Setter.Value>
33                         <ControlTemplate TargetType="{x:Type ScrollBar}">
34                             <Grid x:Name="GridRoot" Width="12" Background="{x:Null}">
35                                 <Track x:Name="PART_Track" Grid.Row="0" IsDirectionReversed="True" Focusable="False">
36                                     <Track.Thumb>
37                                         <Thumb x:Name="Thumb" Background="{TemplateBinding Foreground}"
38                                                Style="{DynamicResource ScrollThumbs}"/>
39                                     </Track.Thumb>
40                                     <Track.IncreaseRepeatButton>
41                                         <RepeatButton x:Name="PageUp" Command="ScrollBar.PageUpCommand" Opacity="0" Focusable="True"/>
42                                     </Track.IncreaseRepeatButton>
43                                     <Track.DecreaseRepeatButton>
44                                         <RepeatButton x:Name="PageDown" Command="ScrollBar.PageDownCommand" Opacity="0" Focusable="True"/>
45                                     </Track.DecreaseRepeatButton>
46                                 </Track>
47                             </Grid>
48
49                             <ControlTemplate.Triggers>
50                                 <Trigger SourceName="Thumb" Property="IsMouseOver" Value="True">
51                                     <Setter Value="{DynamicResource ButtonSelectBrush}"
52                                             TargetName="Thumb" Property="Background"/>
53                                 </Trigger>
54                                 <Trigger SourceName="Thumb" Property="IsDragging" Value="True">
55                                     <Setter Value="{DynamicResource DarkBrush}"
56                                             TargetName="Thumb" Property="Background"/>
57                                 </Trigger>
58
59                                 <Trigger Property="IsEnabled" Value="False">
60                                     <Setter TargetName="Thumb" Property="Visibility" Value="Collapsed"/>
61                                 </Trigger>
62                                 <Trigger Property="Orientation" Value="Horizontal">
63                                     <Setter TargetName="GridRoot" Property="LayoutTransform">
64                                         <Setter.Value>
65                                             <RotateTransform Angle="-90"/>
66                                         </Setter.Value>
67                                     </Setter>
68                                     <Setter TargetName="PART_Track" Property="LayoutTransform">
69                                         <Setter.Value>
70                                             <RotateTransform Angle="-90"/>
71                                         </Setter.Value>
72                                     </Setter>
73                                     <Setter Property="Width" Value="Auto"/>
74                                     <Setter Property="Height" Value="12"/>
75                                     <Setter TargetName="Thumb" Property="Tag" Value="Horizontal"/>
76                                     <Setter TargetName="PageDown" Property="Command" Value="ScrollBar.PageLeftCommand"/>
77                                     <Setter TargetName="PageUp" Property="Command" Value="ScrollBar.PageRightCommand"/>
78                                 </Trigger>
79                             </ControlTemplate.Triggers>
80                         </ControlTemplate>
81                     </Setter.Value>
82                 </Setter>
83             </Style>
84         </ResourceDictionary>
85     </Window.Resources>

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

  1 <Window x:Class="ScrollBar.MainWindow"
  2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6         xmlns:local="clr-namespace:ScrollBar"
  7         mc:Ignorable="d"
  8         Title="MainWindow" Height="450" Width="300" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" WindowStyle="None">
  9     <Window.Resources>
 10         <ResourceDictionary>
 11             <Style x:Key="ScrollThumbs" TargetType="{x:Type Thumb}">
 12                 <Setter Property="Template">
 13                     <Setter.Value>
 14                         <ControlTemplate>
 15                             <Grid x:Name="Grid">
 16                                 <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="Auto"
 17                                            Height="Auto" Fill="Transparent"/>
 18                                 <Border x:Name="Rectangle1" CornerRadius="10 0 0 10" HorizontalAlignment="Stretch"
 19                                         VerticalAlignment="Stretch" Width="Auto" Height="Auto"
 20                                         Background="{TemplateBinding Background}"/>
 21                             </Grid>
 22                             <ControlTemplate.Triggers>
 23                                 <Trigger Property="Tag" Value="Horizontal">
 24                                     <Setter TargetName="Rectangle1" Property="Width" Value="Auto"/>
 25                                     <Setter TargetName="Rectangle1" Property="Height" Value="7"/>
 26                                 </Trigger>
 27                             </ControlTemplate.Triggers>
 28                         </ControlTemplate>
 29                     </Setter.Value>
 30                 </Setter>
 31             </Style>
 32
 33             <!--SCROLLBARS-->
 34             <Style x:Key="{x:Type ScrollBar}" TargetType="{x:Type ScrollBar}">
 35                 <Setter Property="Stylus.IsFlicksEnabled" Value="False"/>
 36                 <Setter Property="Foreground" Value="#AAA8341A"/>
 37                 <Setter Property="Background" Value="DarkGray"/>
 38                 <Setter Property="Width" Value="10"/>
 39                 <Setter Property="Template">
 40                     <Setter.Value>
 41                         <ControlTemplate TargetType="{x:Type ScrollBar}">
 42                             <Grid x:Name="GridRoot" Width="12" Background="{x:Null}">
 43                                 <Track x:Name="PART_Track" Grid.Row="0" IsDirectionReversed="True" Focusable="False">
 44                                     <Track.Thumb>
 45                                         <Thumb x:Name="Thumb" Background="{TemplateBinding Foreground}"
 46                                                Style="{DynamicResource ScrollThumbs}"/>
 47                                     </Track.Thumb>
 48                                     <Track.IncreaseRepeatButton>
 49                                         <RepeatButton x:Name="PageUp" Command="ScrollBar.PageUpCommand" Opacity="0" Focusable="True"/>
 50                                     </Track.IncreaseRepeatButton>
 51                                     <Track.DecreaseRepeatButton>
 52                                         <RepeatButton x:Name="PageDown" Command="ScrollBar.PageDownCommand" Opacity="0" Focusable="True"/>
 53                                     </Track.DecreaseRepeatButton>
 54                                 </Track>
 55                             </Grid>
 56
 57                             <ControlTemplate.Triggers>
 58                                 <Trigger SourceName="Thumb" Property="IsMouseOver" Value="True">
 59                                     <Setter Value="{DynamicResource ButtonSelectBrush}"
 60                                             TargetName="Thumb" Property="Background"/>
 61                                 </Trigger>
 62                                 <Trigger SourceName="Thumb" Property="IsDragging" Value="True">
 63                                     <Setter Value="{DynamicResource DarkBrush}"
 64                                             TargetName="Thumb" Property="Background"/>
 65                                 </Trigger>
 66
 67                                 <Trigger Property="IsEnabled" Value="False">
 68                                     <Setter TargetName="Thumb" Property="Visibility" Value="Collapsed"/>
 69                                 </Trigger>
 70                                 <Trigger Property="Orientation" Value="Horizontal">
 71                                     <Setter TargetName="GridRoot" Property="LayoutTransform">
 72                                         <Setter.Value>
 73                                             <RotateTransform Angle="-90"/>
 74                                         </Setter.Value>
 75                                     </Setter>
 76                                     <Setter TargetName="PART_Track" Property="LayoutTransform">
 77                                         <Setter.Value>
 78                                             <RotateTransform Angle="-90"/>
 79                                         </Setter.Value>
 80                                     </Setter>
 81                                     <Setter Property="Width" Value="Auto"/>
 82                                     <Setter Property="Height" Value="12"/>
 83                                     <Setter TargetName="Thumb" Property="Tag" Value="Horizontal"/>
 84                                     <Setter TargetName="PageDown" Property="Command" Value="ScrollBar.PageLeftCommand"/>
 85                                     <Setter TargetName="PageUp" Property="Command" Value="ScrollBar.PageRightCommand"/>
 86                                 </Trigger>
 87                             </ControlTemplate.Triggers>
 88                         </ControlTemplate>
 89                     </Setter.Value>
 90                 </Setter>
 91             </Style>
 92         </ResourceDictionary>
 93     </Window.Resources>
 94     <Grid Background="#FF222222">
 95         <Grid.RowDefinitions>
 96             <RowDefinition Height="60"/>
 97             <RowDefinition Height="*"/>
 98         </Grid.RowDefinitions>
 99         <Grid Grid.Row="0">
100             <TextBlock Margin="10" Text="Custom ScrollBar" Foreground="#FFEEEEEE" FontSize="33" FontFamily="Script MT Bold" VerticalAlignment="Center"/>
101         </Grid>
102         <ScrollViewer Grid.Row="1">
103             <Grid Height="1000"/>
104         </ScrollViewer>
105     </Grid>
106 </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

欢迎扫描下方二维码关注 Dotnet9 的微信公众号,本站会及时推送最新技术文章(微信公众号“dotnet9_com”):

如有收获,请大力转发,给Dotnet9赞助和支持,谢谢大家对dotnet技术的关注和支持 。

本站使用 wpcom 的 JustNews主题

原文地址:https://www.cnblogs.com/Dotnet9-com/p/12077686.html

时间: 2024-08-01 01:35:21

自定义滚动条(Custom ScrollBar)的相关文章

android自定义滚动条(ScrollBar)样式

1.如果你的scrollbar是Vertical的,设置以下属性 android:scrollbarThumbVertical="@drawable/scrollbar_indicator" android:scrollbarTrackVertical="@drawable/scrollbar_bg" 2.如果你的scrollbar是horizontal的,设置以下属性 android:scrollbarThumbHorizontal="@drawable

jQuery自定义滚动条样式插件mCustomScrollbar

如果你构建一个很有特色和创意的网页,那么肯定希望定义网页中的滚动条样式,这方面的 jQuery 插件比较不错的,有两个:jScrollPane 和 mCustomScrollbar. 关于 jScrollPane,大家见过的可能比较多,但是这个插件太过于古老而且功能不强大,效果在几年前非常不错,但是放在现在就不好说了.所以我选择了后者:mCustomScrollbar.下图是两者官方示例的简单对比: 本文就是介绍如何使用 mCustomScrollbar 这个插件,大部分的内容是翻译自 mCus

iPhone手机解锁效果&amp;&amp;自定义滚动条&amp;&amp;拖拽--Clone&amp;&amp;窗口拖拽(改变大小/最小化/最大化/还原/关闭)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

CSS自定义滚动条样式

相信很多人都遇到过在设计中自定义滚动条样式的情景,之前我都是努力说服设计师接受浏览器自带的滚动条样式,但是这样只能规避还是解决不了问题,最近在项目中遇到了,正好来总结一下.当然,兼容所有浏览器的滚动条样式目前是不存在的. IE下的滚动条样式 IE是最早提供滚动条的样式支持,好多年了,但是其它浏览器一直没有支持,IE独孤求败了. 这些样式规则很简单: scrollbar-arrow-color: color; /*三角箭头的颜色*/ scrollbar-face-color: color; /*立

CSS3自定义滚动条样式 -webkit-scrollbar (一)

Webkit支持拥有overflow属性的区域,列表框,下拉菜单,textarea的滚动条自定义样式.当然,兼容所有浏览器的滚动条样式目前是不存在的. 滚动条的组成: ::-webkit-scrollbar         滚动条整体部分  ::-webkit-scrollbar-thumb             滚动条里面的小方块,能上下左右移动(取决于是垂直滚动条还是水平滚动条)  ::-webkit-scrollbar-track      滚动条的轨道(里面装有thumb)  ::-w

JavaScript自定义滚动条

原生JavaScript自定义滚动条 版权所有,如若转载请注明出处并附上本文链接 http://www.cnblogs.com/Pengxm-liveShare/p/5953810.html 由于项目需求需要用到滚动条, 但是浏览器自带的太丑, 而且每个浏览器显示的都不同, 所以自己编写了一个自定义的滚动条. (由于是菜鸟, 写的比较乱, 大家仅供参考就好, 能提提意见改进下就更好了!) 话不多说先看下样式: 主要功能: 支持滚动条自定义样式(颜色, 大小) 支持鼠标事件(点击和滑轮滚动) 主要

javascript自定义滚动条插件.

在实际项目中,经常由于浏览器自带的滚动条样式太戳,而且在各个浏览器中显示不一样,所以我们不得不去实现自定义的滚动条,今天我就用最少的代码实现了一个自定义滚动条,代码量区区只有几十行,使用起来也非常方便. <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title

javascript自定义滚动条插件,几行代码的事儿

在实际项目中,经常由于浏览器自带的滚动条样式太戳,而且在各个浏览器中显示不一样,所以我们不得不去实现自定义的滚动条,今天我就用最少的代码实现了一个自定义滚动条,代码量区区只有几十行,使用起来也非常方便. <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title

自定义滚动条mCustomScrollbar

mCustomScrollbar 是个基于 jQuery UI 的自定义滚动条插件,它可以让你灵活的通过 CSS 定义网页的滚动条,并且垂直和水平两个方向的滚动条都可以定义,它通过 Brandon Aaron jquery mouse-wheel plugin 提供了鼠标滚动的支持,并且在滚动的过程中,还可以缓冲滚动使得滚动更加的平滑,还可以自动调整滚动条的位置和定义滚动到的位置等. 1.如何使用 mCustomScrollbar(必须要加载如下的4个文件) jquery.mCustomScro