想要实现的效果

原生滑动条

需要认识一下滑动条的组成

  • 在原生控件中生成“资源字典”对应的样式
  • 然后在track所在的列进行添砖加瓦
  • 由于track在row="1"的位置,只需要在这个位置上面添加一个Ellipse和Line
  • Ellipse是来描述固定在滑动条上的中心点的位置
  • line是来描述Thumb从中心点移动到其他位置显示的颜色

具体的自定样式修改

SliderHorizontal样式

<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" MinHeight="{TemplateBinding MinHeight}" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<TickBar
x:Name="TopTick"
Grid.Row="0"
Height="4"
Margin="0,0,0,2"
Fill="{TemplateBinding Foreground}"
Placement="Top"
Visibility="Collapsed" />
<TickBar
x:Name="BottomTick"
Grid.Row="2"
Height="4"
Margin="0,2,0,0"
Fill="{TemplateBinding Foreground}"
Placement="Bottom"
Visibility="Collapsed" />
<Border
x:Name="TrackBackground"
Grid.Row="1"
Height="4.0"
Margin="5,0"
VerticalAlignment="center"
Background="{StaticResource SliderThumb.Track.Border}"
BorderBrush="{StaticResource SliderThumb.Track.Border}"
BorderThickness="1">
<Canvas Margin="-6,-1">
<Rectangle
x:Name="PART_SelectionRange"
Height="4.0"
Fill="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"
Visibility="Hidden" />
</Canvas>
</Border>
<Ellipse
Grid.Row="1"
Width="10"
Height="10"
Fill="Black" />
<Line
Grid.Row="1"
Grid.RowSpan="3"
VerticalAlignment="Center"
Fill="Purple"
Stroke="Purple"
StrokeThickness="3"
X1="{Binding Path=LineX1, RelativeSource={RelativeSource TemplatedParent}}"
X2="{Binding Path=LineX2, RelativeSource={RelativeSource TemplatedParent}}"
Y1="0"
Y2="0" />
<Track x:Name="PART_Track" Grid.Row="1">
<Track.DecreaseRepeatButton>
<RepeatButton Command="{x:Static Slider.DecreaseLarge}" Style="{StaticResource RepeatButtonTransparent}" />
</Track.DecreaseRepeatButton>
<Track.IncreaseRepeatButton>
<RepeatButton Command="{x:Static Slider.IncreaseLarge}" Style="{StaticResource RepeatButtonTransparent}" />
</Track.IncreaseRepeatButton>
<Track.Thumb>
<Thumb
x:Name="Thumb"
Width="11"
Height="18"
VerticalAlignment="Center"
Focusable="False"
OverridesDefaultStyle="True"
Template="{StaticResource SliderThumbHorizontalDefault}" />
</Track.Thumb>
</Track>
</Grid>

主要颜色距离的显示通过X1和X2的编辑显示距离

  • 所以需要将这里的X1和X2改成自定义进行绑定
  • 新建自定义控件

自定义控件CentreSlider

public class CentreSlider : Slider {
protected override void OnValueChanged(double oldValue, double newValue) {
base.OnValueChanged(oldValue, newValue);
RefreshSlider();
}
protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo) {
base.OnRenderSizeChanged(sizeInfo);
RefreshSlider();
}
public double LineX1 {
get { return (double)GetValue(LineX1Property); }
set { SetValue(LineX1Property, value); }
}
public double LineX2 {
get { return (double)GetValue(LineX2Property); }
set { SetValue(LineX2Property, value); }
} // Using a DependencyProperty as the backing store for LineX2. This enables animation, styling, binding, etc...
public static readonly DependencyProperty LineX2Property =
DependencyProperty.Register("LineX2", typeof(double), typeof(CentreSlider), new PropertyMetadata(0.0));
// Using a DependencyProperty as the backing store for LineX1. This enables animation, styling, binding, etc...
public static readonly DependencyProperty LineX1Property =
DependencyProperty.Register("LineX1", typeof(double), typeof(CentreSlider), new PropertyMetadata(0.0)); public void RefreshSlider() {
//计算值和宽度的比例
var proportion = ActualWidth / Maximum;
//起始点从中心点开始
LineX1 = ActualWidth / 2;
//结束点值*比例
LineX2 = Value * Proportion;
}
}

最终效果

WPF中实现含有中心点Slider双向滑动条的更多相关文章

  1. NGUI的slider的滑动条制作(SliderScript)

    一,添加一个sprite,给这个sprite添加一个背景如下图: 二,在当前的sprite添加一个子sprite同时给子层添加一个颜色较深的图片,这个子层覆盖当前sprite,我们需要调节子层的dep ...

  2. WPF中 MVVM模式的Slider Binding.

    对于Button的Command的绑定可以通过实现ICommand接口来进行,但是Slider并没有Command属性. 另外如果要实现MVVM模式的话,需要将一些Method和Slider的Even ...

  3. WPF 背景颜色渐变的滑动条实现

    原文:WPF 背景颜色渐变的滑动条实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/83507 ...

  4. easyUI之slider滑动条框

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...

  5. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  6. IOS开发-UI学习-UISlider(滑动条)的使用

    滑动条即UISlider,是我们常见的软件中设置音量,亮度等的滑条,初始化及基本设置如下: // 新建滑动条 UISlider *slider = [[UISlider alloc]initWithF ...

  7. 第15.44节、PyQt输入部件:QAbstractSlider派生类QScrollBar滚动条、QSlider滑动条、QDial刻度盘功能详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 Designer中的输入部件Horizo ...

  8. 第三十七章、PyQt输入部件:QAbstractSlider派生类QScrollBar滚动条、QSlider滑动条、QDial刻度盘功能介绍

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 Designer中的输入部件Horizo ...

  9. [OpenCV-Python] 8 用滑动条做调色板

    文章目录 OpenCV-Python:II OpenCV 中的 Gui 特性 8 用滑动条做调色板 8.1 代码示例 练习 OpenCV-Python:II OpenCV 中的 Gui 特性 8 用滑 ...

  10. iSO垂直滑动条VerticalSlider

    由于项目需要实现一个垂直的Slider,滑动条使用UIlabel实现,按钮使用UIButton,按钮可以设置背景图片,代码如下 VerticalSlider.h // // VerticalSlide ...

随机推荐

  1. 解决ubuntu 20.04、22.04 即新版本 fcitx 无法使用的问题

    前提 已在系统设置中将fcitx设置为默认 fcitx开机自启 配置的过程不在本文讨论范围之内 开机自启可通过安装gnome-tweaks配置实现 问题分析流程 手动启动fcitx时提示设置XMODI ...

  2. 迁移学习(NRC)《Exploiting the Intrinsic Neighborhood Structure for Source-free Domain Adaptation》

    论文信息 论文标题:Exploiting the Intrinsic Neighborhood Structure for Source-free Domain Adaptation论文作者:Shiq ...

  3. TSDB - VictoriaMetrics 技术原理浅析

    版权说明: 本文章版权归本人及博客园共同所有,转载请在文章前标明原文出处( https://www.cnblogs.com/mikevictor07/p/17258452.html ),以下内容为个人 ...

  4. 驱动开发:内核使用IO/DPC定时器

    本章将继续探索驱动开发中的基础部分,定时器在内核中同样很常用,在内核中定时器可以使用两种,即IO定时器,以及DPC定时器,一般来说IO定时器是DDK中提供的一种,该定时器可以为间隔为N秒做定时,但如果 ...

  5. Django之form表单相关操作

    目录 摘要 form表单 form表单的action参数 form表单的method参数 request.method方法 简介 get请求传递数据 post请求传递数据 GET/POST实际应用,简 ...

  6. pychearm日常用法

    一 常用快捷键 编辑类:Ctrl + D             复制选定的区域或行Ctrl + Y           删除选定的行Ctrl + Alt + L     代码格式化Ctrl + Al ...

  7. 即时通讯系统为什么选择GaussDB(for Redis)?

    摘要:如果你需要一款稳定可靠的高性能企业级KV数据库,不妨试试GaussDB(for Redis). 每当网络上爆出热点新闻,混迹于各个社交媒体的小伙伴们全都开启了讨论模式.一条消息的产生是如何在群聊 ...

  8. R的基本用法

    R变量的命名格式 必须以字母开头 只能包含字母.数字.下划线和.. 对大小写敏感 不能是保留关键字 数据类型(mode) numeric - (10.5, 55, 787) integer - (1L ...

  9. 详解Redis三大集群模式,轻松实现高可用!

    1. Redis集群简介 1.1 什么是Redis集群 Redis集群是一种通过将多个Redis节点连接在一起以实现高可用性.数据分片和负载均衡的技术.它允许Redis在不同节点上同时提供服务,提高整 ...

  10. List嵌套排序并取第一个对象

    using Newtonsoft.Json;using 嵌套List排序; //示例listvar exampleString = "{\"code\":1,\" ...