WPF Slider滑动条的颜色修改方法

作者:无名 - C#教程 -

效果如下:

鄙人虽然开发WPF有些时间,但之前一直是一些简单Template和Style改改之类的工作,并没有深入研究过。此次为了完成工作,首先也是网上搜了半天,没有找到合适的代码直接拷贝(搜索能力待提高),干脆就直接静下心来琢磨琢磨。

一开始在界面上就放了Slider,挠挠头,怎么修改Template才能达到效果呢?后来想到了Blend,之前一直听说很强大的界面设计工具,但是一直没有用过,就趁此机会就简单运用了一下。Blend中很牛逼的就是编辑模板,通过创建模板副本,可以看到Slider结构

结合代码发现,Thumb左右两边的ReapeatButton的宽度会随着Thumb的位置会变化。那问题就变得简单很多,修改左RepeatButton的Template就可以达到目的,核心代码如下。

    <Style x:Key="DecreaseBtn" TargetType="{x:Type RepeatButton}">
      <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type RepeatButton}">
            <Border Background="{TemplateBinding Background}" 
                Height="{TemplateBinding Height}" Width="{TemplateBinding Width}">
              <!--轨迹,设置Background-->
              <Border Margin="0,0,-1,0" Background="{StaticResource SliderThumb.Track.DecreaseBackground}" 
                  VerticalAlignment="center" Height="4.0" />
            </Border>
          </ControlTemplate>
        </Setter.Value>
      </Setter>
    </Style>

完整代码(只是考虑水平的Slider):

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <SolidColorBrush x:Key="SliderThumb.Static.Foreground" Color="#FFE5E5E5"/>
  <SolidColorBrush x:Key="SliderThumb.MouseOver.Background" Color="Gray"/>
  <SolidColorBrush x:Key="SliderThumb.MouseOver.Border" Color="#FF7Eb4EA"/>
  <SolidColorBrush x:Key="SliderThumb.Pressed.Background" Color="Gray"/>
  <SolidColorBrush x:Key="SliderThumb.Pressed.Border" Color="Gray"/>
  <SolidColorBrush x:Key="SliderThumb.Disabled.Background" Color="#FFF0F0F0"/>
  <SolidColorBrush x:Key="SliderThumb.Disabled.Border" Color="#FFD9D9D9"/>
  <SolidColorBrush x:Key="SliderThumb.Static.Background" Color="#989898"/>
  <ControlTemplate x:Key="SliderThumbHorizontalTop" TargetType="{x:Type Thumb}">
    <Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
      <Path x:Name="grip" Data="M 0,6 C0,6 5.5,0 5.5,0 5.5,0 11,6 11,6 11,6 11,18 11,18 11,18 0,18 0,18 0,18 0,6 0,6 z" 
         Fill="{StaticResource SliderThumb.Static.Background}" 
         Stretch="Fill" SnapsToDevicePixels="True" 
         Stroke="{Binding Path=Fill, RelativeSource={x:Static RelativeSource.Self}}" StrokeThickness="1" UseLayoutRounding="True" VerticalAlignment="Center"/>
    </Grid>
    <ControlTemplate.Triggers>
      <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
        <Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
      </Trigger>
      <Trigger Property="IsDragging" Value="true">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
        <Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
      </Trigger>
      <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
        <Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
      </Trigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>
  <ControlTemplate x:Key="SliderThumbHorizontalBottom" TargetType="{x:Type Thumb}">
    <Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
      <Path x:Name="grip" Data="M 0,12 C0,12 5.5,18 5.5,18 5.5,18 11,12 11,12 11,12 11,0 11,0 11,0 0,0 0,0 0,0 0,12 0,12 z" 
         Fill="{StaticResource SliderThumb.Static.Background}"
         Stretch="Fill" 
         SnapsToDevicePixels="True" 
         Stroke="{Binding Path=Fill, RelativeSource={x:Static RelativeSource.Self}}" StrokeThickness="1" UseLayoutRounding="True" VerticalAlignment="Center"/>
    </Grid>
    <ControlTemplate.Triggers>
      <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
        <Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Border}"/>
      </Trigger>
      <Trigger Property="IsDragging" Value="true">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
        <Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
      </Trigger>
      <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
        <Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
      </Trigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>
  <SolidColorBrush x:Key="SliderThumb.Track.Background" Color="#b6b6b6"/>
  <SolidColorBrush x:Key="SliderThumb.Track.DecreaseBackground" Color="#45db5e"/>
  <Style x:Key="RepeatButtonTransparent" TargetType="{x:Type RepeatButton}">
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="Focusable" Value="false"/>
    <Setter Property="IsTabStop" Value="false"/>
  </Style>
  <Style x:Key="DecreaseBtn" TargetType="{x:Type RepeatButton}" BasedOn="{StaticResource RepeatButtonTransparent}">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type RepeatButton}">
          <Border Background="{TemplateBinding Background}" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}">
            <Border Margin="1,0,-1,0" Background="{StaticResource SliderThumb.Track.DecreaseBackground}" 
                VerticalAlignment="center" Height="4.0" />
          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
  <Style x:Key="IncreaseBtn" TargetType="{x:Type RepeatButton}" BasedOn="{StaticResource RepeatButtonTransparent}">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type RepeatButton}">
          <Border Background="{TemplateBinding Background}" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}"/>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
  <ControlTemplate x:Key="SliderThumbHorizontalDefault" TargetType="{x:Type Thumb}">
    <Grid HorizontalAlignment="Center" UseLayoutRounding="True" VerticalAlignment="Center">
      <Path x:Name="grip" Data="M0 512C0 229.230208 229.805588 0 512 0 794.769792 0 1024 229.805588 1024 512 1024 794.769792 794.194412 1024 512 1024 229.230208 1024 0 794.194412 0 512Z" 
           StrokeThickness="1" Fill="{StaticResource SliderThumb.Static.Background}" Stroke="{Binding Path=Fill, RelativeSource={x:Static RelativeSource.Self}}"
           Width="18" Height="{Binding Path=Width, RelativeSource={x:Static RelativeSource.Self}}"
           Stretch="Fill" SnapsToDevicePixels="True" UseLayoutRounding="True" VerticalAlignment="Center"/>
    </Grid>
    <ControlTemplate.Triggers>
      <Trigger Property="IsMouseOver" Value="true">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.MouseOver.Background}"/>
      </Trigger>
      <Trigger Property="IsDragging" Value="true">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Background}"/>
        <Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Pressed.Border}"/>
      </Trigger>
      <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Fill" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Background}"/>
        <Setter Property="Stroke" TargetName="grip" Value="{StaticResource SliderThumb.Disabled.Border}"/>
      </Trigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>
  <ControlTemplate x:Key="SliderHorizontal" TargetType="{x:Type Slider}">
    <Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" 
          BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="15"/>
          <RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}"/>
          <RowDefinition Height="15"/>
        </Grid.RowDefinitions>
        <TickBar x:Name="TopTick" Fill="{TemplateBinding Foreground}" Height="4" Margin="0,0,0,2" Placement="Top" Grid.Row="0" 
               Visibility="Collapsed"/>
        <TickBar x:Name="BottomTick" Fill="{TemplateBinding Foreground}" Height="4" Margin="0,2,0,0" Placement="Bottom" Grid.Row="2" 
               Visibility="Collapsed"/>
        <Border x:Name="TrackBackground" BorderBrush="{StaticResource SliderThumb.Track.Background}" 
            BorderThickness="1" Background="{Binding Path=BorderBrush, RelativeSource={x:Static RelativeSource.Self}}" 
            Height="4.0" Margin="5,0" Grid.Row="1" VerticalAlignment="center">
          <Canvas HorizontalAlignment="Stretch" Margin="0,-1">
            <Rectangle x:Name="PART_SelectionRange" Fill="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"
                  Height="{Binding Path=Height, ElementName=TrackBackground}" Visibility="Hidden"/>
          </Canvas>
        </Border>
        <Track x:Name="PART_Track" Grid.Row="1">
          <Track.DecreaseRepeatButton>
            <RepeatButton Command="{x:Static Slider.DecreaseLarge}" Style="{StaticResource DecreaseBtn}"/>
          </Track.DecreaseRepeatButton>
          <Track.IncreaseRepeatButton>
            <RepeatButton Command="{x:Static Slider.IncreaseLarge}" Style="{StaticResource IncreaseBtn}"/>
          </Track.IncreaseRepeatButton>
          <Track.Thumb>
            <Thumb x:Name="Thumb" Focusable="False" Height="20" OverridesDefaultStyle="True" 
                Template="{StaticResource SliderThumbHorizontalDefault}" VerticalAlignment="Center" 
                Width="{Binding Path=Height, RelativeSource={x:Static RelativeSource.Self}}"/>
          </Track.Thumb>
        </Track>
      </Grid>
    </Border>
    <ControlTemplate.Triggers>
      <Trigger Property="TickPlacement" Value="TopLeft">
        <Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
        <Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbHorizontalTop}"/>
        <Setter Property="Margin" TargetName="TrackBackground" Value="5,2,5,0"/>
      </Trigger>
      <Trigger Property="TickPlacement" Value="BottomRight">
        <Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
        <Setter Property="Template" TargetName="Thumb" Value="{StaticResource SliderThumbHorizontalBottom}"/>
        <Setter Property="Margin" TargetName="TrackBackground" Value="5,0,5,2"/>
      </Trigger>
      <Trigger Property="TickPlacement" Value="Both">
        <Setter Property="Visibility" TargetName="TopTick" Value="Visible"/>
        <Setter Property="Visibility" TargetName="BottomTick" Value="Visible"/>
      </Trigger>
      <Trigger Property="IsSelectionRangeEnabled" Value="true">
        <Setter Property="Visibility" TargetName="PART_SelectionRange" Value="Visible"/>
      </Trigger>
    </ControlTemplate.Triggers>
  </ControlTemplate>
  <Style x:Key="SliderStyle" TargetType="{x:Type Slider}">
    <Setter Property="Stylus.IsPressAndHoldEnabled" Value="false"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderBrush" Value="Transparent"/>
    <Setter Property="Template" Value="{StaticResource SliderHorizontal}"/>
  </Style>
</ResourceDictionary>

其实最重要的还是控件的结构,只要对此很熟悉,做出理想的控件应该不难。

总结

以上所述是IT人知识库小编给大家介绍的WPF Slider滑动条的颜色修改方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,IT人知识库小编会及时回复大家的。在此也非常感谢大家对网站的支持!

IT人知识库 该篇知识地址:http://www.itpeo.net/12809/518687.html





C#实现文章添加内链的方法

为什么文章要添加内链?  1.有利于读者      &nb... ...

C#公众号开发之给用户发红包

红包功能简单介绍: 1、商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种... ...

C# 获取 PC 序列号的方法示例

在 C++ 需要使用 GetSystemFirmwareTable 的方法来获得 PC 的序列号,需要写的代码很多,但是... ...

C#程序异常关闭时的捕获

本文主要以一个简单的小例子,描述C# Winform程序异常关闭时,如何进行捕获,并记录日志。 概述 有时在界面的事件... ...

C#实现一个简单实用的TXT文本操作及日志框架详解

前言 首先先介绍一下这个项目,该项目实现了文本写入及读取,日志写入指定文件夹或默认文件夹,日志数量控制,单个日志大小控制... ...

rfedfre

c#源码的执行过程详解

要讲到C#源码的执行过程 首先要提下程序集,因为Clr并不是和托管摸块打交道的,而是和程序集(dll,exe) 1、从哪... ...

C# winform主界面打开并关闭登录界面的方法

在winform 界面编程中,我们有时候要在主界面打开之前先显示登录界面,当登录界面用户信息校验正确后才打开主界面,而这... ...

rfedfre

C#怎么添加PPT背景

我们在创建Powerpoint文档时,系统默认的幻灯片是空白背景的,很多时候我们需要自定义幻灯片背景,以达到美观的文档效... ...

C#实现Nginx平滑加权轮询算法

本文实例为大家分享了C#实现Nginx平滑加权轮询算法的具体代码,供大家参考,具体内容如下 代码很简单,算法很经典!&... ...

C#支付宝新版支付请求接口调用

本文实例为大家分享了C#支付宝新版支付请求接口调用的具体代码,供大家参考,具体内容如下 因为支付宝已经集成了完整的SDK... ...

.NET Core开发之配置详解

熟悉ASP.NET的开发者一定对web.config文件不陌生。在ASP.NET环境中,要想添加配置参数,一般也都会在此... ...

C# 7.2中结构体性能问题的解决方案

前言 在某些使用了readonly关键字的情况下,C#编译器会创建出结构体的防御副本。虽然这个问题已经众所周知并被记录下... ...

rfedfre

怎么使用C#代码创建快捷方式文件详解

前言 快捷方式是一种特殊的文件,扩展名为 lnk。有很多种方式来创建快捷方式,首先我们看一下快捷方式是什么。对快捷方式点... ...

rfedfre

WPF 在image控件用鼠标拖拽出矩形的实现方法

今天有小伙伴问我一个问题,在image控件用鼠标拖拽出矩形,本文告诉大家如何使用鼠标画出矩形 做出来的效果先请大家看一下... ...

WPF实现控件拖动的示例代码

实现控件拖动的基本原理是对鼠标位置的捕获,同时根据鼠标按键的按下、释放确定控件移动的幅度和时机。 简单示例: 在... ...

rfedfre

C#中字段、属性、只读、构造函数赋值、反射赋值的问题

C#中字段、属性和构造函数赋值的问题提出问题如下所述: 首先提出几个问题: 1、如何实现自己的注入框架? 2、字段和自动... ...

C#获取日期的星期名称实例代码

具体代码如下所示: private string GetWeekName(DayOfWeek week) {... ...

rfedfre

C# 7.0中解构功能详解

本文为大家分享了C# 7.0中的解构功能,供大家参考,具体内容如下 解构元组   C#7.0新增了诸多功能,其中有一项是... ...

C#实现ini文件读写操作

本文实例为大家分享了C#语言实现ini文件读写操作的具体代码,供大家参考,具体内容如下 1、ini文件是什么? 见百度百... ...

rfedfre

C# WPF 父控件通过使用可视化树找到子控件的示例代码

在我们使用WPF设计前台界面时,经常会重写数据模板,或者把控件放到数据模板里。但是一旦将控件放到数据模板中,在后台就没有... ...