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

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

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

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

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

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

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

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

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

<Grid>
<StackPanel Margin="15,0,15,0"
x:Name="RangeContainer"
Orientation="Horizontal"> </StackPanel>
<Canvas x:Name="ThumbContainer">
</Canvas>
</Grid>

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

<Style TargetType="local:ThumbEx">
<Setter Property="Width"
Value="30"></Setter>
<Setter Property="Height"
Value="150"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Thumb">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="40" />
<RowDefinition />
<RowDefinition Height="40" />
</Grid.RowDefinitions> <StackPanel>
<Rectangle SnapsToDevicePixels="True"
Height="30"
StrokeThickness="0"
Stroke="LightGray"
Fill="LightGray"></Rectangle>
<Path Fill="LightGray"
Stroke="LightGray"
StrokeThickness="1"
Data="M0,0 L30,0 L15,10z">
</Path>
</StackPanel> <Path Grid.Row="1"
Data="M15,0 L15,110"
Fill="Black"
Stroke="Black"
StrokeThickness="1"></Path> <StackPanel Grid.Row="2">
<Path Fill="LightGray"
StrokeThickness="1"
Stroke="LightGray"
Data="M15,0 L0,10 L30,10z">
</Path>
<Rectangle Height="30"
StrokeThickness="0"
Stroke="LightGray"
Fill="LightGray"></Rectangle>
</StackPanel> </Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

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

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

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

public class RangeItem
{
#region 字段
private double _from;
private double _to;
private string _name;
private double _maxDuration;
private bool _isStatic;
private double _duration; #endregion #region 属性
public double From
{
get
{
return _from;
}
set
{
_from = value;
}
} public double To
{
get
{
return _to;
}
set
{
_to = value;
}
} /// <summary>
/// 是否静止
/// </summary>
public bool IsStatic
{
get
{
return _isStatic;
}
set
{
_isStatic = value;
}
} public double Duration
{
get
{
return _duration;
}
set
{
_duration = value;
}
} public double MaxDuration
{
get
{
return _maxDuration;
}
set
{
_maxDuration = value;
}
} #endregion
} 重要的属性有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. 【JavaScript】获取未知类的结构

    目录结构: // contents structure [-] 为什么需要获取类的结构 关于JavaScript中的类 定义类的方法 第一种 第二种 DEMO HTML页面 date文件 注意事项 参 ...

  2. [deviceone开发]-多种样式下拉菜单demo

    一.简介 该demo主要展示了3种下拉菜单. 一.仿QQ弹出菜单 主要实现原理是通过add一个ui,然后通过点击事件控制其visible属性来显示或者隐藏. 二.组合下拉菜单 主要用到的控件是do_A ...

  3. 浏览器history对象

    History 对象 history对象记录了用户曾经浏览过的页面(URL),并可以实现浏览器前进与后退相似导航的功能. 注意:从窗口被打开的那一刻开始记录,每个浏览器窗口.每个标签页乃至每个框架,都 ...

  4. 打开MySQL数据库远程访问的权限

    说明:转自,http://www.cnblogs.com/ycsfwhh/archive/2012/08/07/2626597.html    本人亲测方法1有效,方法2待验证 下载GPL版本安装 M ...

  5. 分享dubbo.xsd和idubbo.xsd的可用地址

    dubbo.xsd和idubbo.xsd的官方地址不可用 http://code.alibabatech.com/schema/dubbo/dubbo.xsd似乎挂了,真是淡淡的忧伤啊,然后就各种报错 ...

  6. Oracle创建表空间、用户、授权

    在创建好数据实例(数据库)好后的基础上,后续做的事情如下: ---创建表空间 create tablespace LIS2011DATA logging datafile 'd:\oracle\pro ...

  7. ICompare接口、Sort()方法

    1.接口中的方法并不实现具体功能,继承于该接口的类必须实现具体功能. 核心思想:对修改封闭,对扩展开放. 2.Sort()方法: 默认:Sort(内容) 英文:按照首字母顺序排序,首字母相同则看第二个 ...

  8. SQLSERVER2008 R2安装说明

    SQLSERVER2008 R2安装说明一. 安装环境:SQLSERVER2008 R2有32位版本和64位版本,32位版本可以安装在WINDOWS XP及以上操32位和64位的操作系统上,如果服务器 ...

  9. MySQL备份还原——mysqldump工具介绍

    mysqldump是一款MySQL逻辑备份的工具,他将数据库里面的对象(表)导出成SQL脚本文件.有点类似于SQL SEVER的"任务-生成脚本"的逻辑备份功能.mysqldump ...

  10. Symantec Backup Exec 2010 Agent For Linux安装

    以前写过一篇文章介绍过Symantec Backup Exec 2012 Agent For Linux安装安装,今天介绍一下Symantec Backup Exec 2010 Agent For L ...