WPF 多滑块Slider简单实现(MultiRangeSlider)

WPF中的MultiRangeSlider,网上有商业的,有开源的,找了几个都不太理想,那就自己写

一个吧,给大家提供点思路。

WPF中的Slider,看他的模板那就很复杂,如果想弄一个可以自定义样式的MultiRangeSlider

那就得花大时间好好弄,粗略的想MultiRangeSlider不就是几个滑块(Thumb),加几个矩形么,

一个滑块对应两个矩形,滑块移动的时候,不就两边的矩形的宽度的变化么,矩形我们只想

关注宽度变化,不想再去调整他的其实位置,用什么容器来装矩形呢,StackPanel,里面的对象

总是首尾相连的嘛,可是要使Thumb能够水平移动,在StackPanel中显示不合适,那就放到Canvas

中,然后把这两个容器使用Grid叠在一起,Canvas在上,就是下面这个样子

  1. <Grid>
  2. <StackPanel Margin="15,0,15,0"
  3. x:Name="RangeContainer"
  4. Orientation="Horizontal">
  5. </StackPanel>
  6. <Canvas x:Name="ThumbContainer">
  7. </Canvas>
  8. </Grid>

滑块为了好看,也做了样式修改

  1. <Style TargetType="local:ThumbEx">
  2. <Setter Property="Width"
  3. Value="30"></Setter>
  4. <Setter Property="Height"
  5. Value="150"></Setter>
  6. <Setter Property="Template">
  7. <Setter.Value>
  8. <ControlTemplate TargetType="Thumb">
  9. <Grid>
  10. <Grid.RowDefinitions>
  11. <RowDefinition Height="40" />
  12. <RowDefinition />
  13. <RowDefinition Height="40" />
  14. </Grid.RowDefinitions>
  15. <StackPanel>
  16. <Rectangle SnapsToDevicePixels="True"
  17. Height="30"
  18. StrokeThickness="0"
  19. Stroke="LightGray"
  20. Fill="LightGray"></Rectangle>
  21. <Path Fill="LightGray"
  22. Stroke="LightGray"
  23. StrokeThickness="1"
  24. Data="M0,0 L30,0 L15,10z">
  25. </Path>
  26. </StackPanel>
  27. <Path Grid.Row="1"
  28. Data="M15,0 L15,110"
  29. Fill="Black"
  30. Stroke="Black"
  31. StrokeThickness="1"></Path>
  32. <StackPanel Grid.Row="2">
  33. <Path Fill="LightGray"
  34. StrokeThickness="1"
  35. Stroke="LightGray"
  36. Data="M15,0 L0,10 L30,10z">
  37. </Path>
  38. <Rectangle Height="30"
  39. StrokeThickness="0"
  40. Stroke="LightGray"
  41. Fill="LightGray"></Rectangle>
  42. </StackPanel>
  43. </Grid>
  44. </ControlTemplate>
  45. </Setter.Value>
  46. </Setter>
  47. </Style>

为了简便,我用了UserControl来实现这个控件,当然得支持各种数据Binding啊,对于这个控件来说,

我不需要知道外面是什么样的数据结构,我只需要知道我要展现多滑块需要哪些数据就行,

所以得有一个描述Range的数据结构

  1. public class RangeItem
  2. {
  3. #region 字段
  4. private double _from;
  5. private double _to;
  6. private string _name;
  7. private double _maxDuration;
  8. private bool _isStatic;
  9. private double _duration;
  10. #endregion
  11. #region 属性
  12. public double From
  13. {
  14. get
  15. {
  16. return _from;
  17. }
  18. set
  19. {
  20. _from = value;
  21. }
  22. }
  23. public double To
  24. {
  25. get
  26. {
  27. return _to;
  28. }
  29. set
  30. {
  31. _to = value;
  32. }
  33. }
  34. /// <summary>
  35. /// 是否静止
  36. /// </summary>
  37. public bool IsStatic
  38. {
  39. get
  40. {
  41. return _isStatic;
  42. }
  43. set
  44. {
  45. _isStatic = value;
  46. }
  47. }
  48. public double Duration
  49. {
  50. get
  51. {
  52. return _duration;
  53. }
  54. set
  55. {
  56. _duration = value;
  57. }
  58. }
  59. public double MaxDuration
  60. {
  61. get
  62. {
  63. return _maxDuration;
  64. }
  65. set
  66. {
  67. _maxDuration = value;
  68. }
  69. }
  70. #endregion
  71. }
  72. 重要的属性有From(起始值),To(结束值),MaxDuration(总长),

根据这一个数据,我们就能生成一个矩形。整个Slider的宽度是固定的,所以就可以根据

(To-From)/MaxDuration*Slider长度,就能计算出这个矩形的宽度,直接加入StackPanel就

行。

矩形加进去了,现在加滑块,因为滑块是在Canvas中的,所以他需要确切知道Canvas.Left附加

属性,这个Left不就左边矩形的宽度么。在把滑块和左右两边的矩形关联起来,因为矩形的拖动事件

需要实时去改变两边的矩形的宽度。

我还是直接上代码吧,讲这么多你们也不一定清楚,哎。

WPF MultiRangeSlider

WPF MultiRangeSlider 简单实现的更多相关文章

  1. WPF 一个简单的颜色选择器

    原文:WPF 一个简单的颜色选择器 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/8340999 ...

  2. WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍

    WPF自学入门(十一)WPF MVVM模式Command命令   在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式 ...

  3. [Songqw.Net 基础]WPF实现简单的插件化开发

    原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/ar ...

  4. WPF MvvmLight简单实例(1) 页面导航

    原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击“Load”按钮,页面会加载PageOne,点击PageOne页面中的“Next” ...

  5. WPF自学入门(十)WPF MVVM简单介绍

     前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...

  6. WPF 最简单的TextBox水印

    最简单的TextBox加水印的方法,但是不具有很强的通用性. 如果你只是使用一次,或者用的不多,偷偷懒可以使用. 因为此方法只需要修改TextBox的Template,而不用重写何任代码. 注意: 1 ...

  7. WPF 实现简单的跑马灯

    本文用WPF的动画实现一个简单的跑马灯 xmal: <Window x:Class="wpfstatusBar.MainWindow" xmlns="http:// ...

  8. WPF MVVM简单介绍

     前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...

  9. WPF绘制简单常用的Path

    写代码出身的我们经常需要使用一些简单 但是不是规则图形的Path 但限于美工功底有限 不知道怎么去画 下面我告诉大家一些简单的小技巧 用代码来画Path 个人还是比较喜欢用代码 因为数值控制的更精细 ...

随机推荐

  1. CSS3——3D旋转图(跑马灯效果图)

    CSS3新增了很多新的属性,可以用很少的代码实现炫酷的动画效果,但由于兼容性各浏览器的能力存在不足,有特别需求的网站就呵呵啦.H5C3已是大势所趋了,之前看过一个新闻,Chrome将在年底全面转向H5 ...

  2. 深入JavaScript:词法分析、连续赋值猜想

    JavaScript:词法分析.连续赋值猜想 原创文章,转摘请注明出处:苏福:http://www.cnblogs.com/susufufu/p/5851642.html 深夜发文,先吐槽下博客园的编 ...

  3. iOS 根据字符串数目,自定义Label等控件的高度

    利用分类,NSString,增加一个方法. #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interfa ...

  4. 基本排序算法——快速排序java实现

    简单的快速排序算法,我竟然花费了如此多的时间来写作,好好学习. /** * */ package basic.sort; import java.util.Arrays; import java.ut ...

  5. Sanboxie 5.14安装图解

    Sanboxie, 即沙盘,引用官方解释:电脑就像一张纸,程序的运行与改动,就像将字写在纸上.而Sandboxie就相当于在纸上放了块玻璃,程序的运行与改动就像写在了那块玻璃上,除去玻璃,纸上还是一点 ...

  6. 使用ArcGIS JavaScript API 3.18 加载天地图

    对于中国开发者在创建GIS应用的时候,往往比较头疼的是底图资源的缺乏.其实国家测绘地信局就提供一个很好的免费资源:天地图.使用ArcGIS API的开发人员可以直接利用该资源作为地图应用的底图. Ar ...

  7. C++序列化、反序列化

    几个常见的库 http://stackoverflow.com/questions/3637581/fastest-c-serialization Boost: Fast, assorted C++ ...

  8. Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误

    嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...

  9. 移动端App广告常见的10种形式

    什么是App广告?   App广告,或称In-App广告,是指智能手机和平板电脑这类移动设备中第三方应用程序内置广告,属于移动广告的子类别. App广告兴起得益于其载体—App的风行.平板电脑和大屏触 ...

  10. Android打造属于自己的数据库操作类。

    1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...