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. 游标的使用——mysql

    CREATE DEFINER=`root`@`%` PROCEDURE `split_category_all`()BEGIN declare categ varchar(10); ##套餐列 dec ...

  2. 关于在线编辑器的选择:tinymce - nilcms

    一开始使用的是百度开发的编辑器:ueditor.使用方便,很容易就部署了.现在发现此编辑器也就做一些安全性的更新,而且对于这个编辑器也越来越不喜欢了. 1.臃肿.[1.4.3.3 PHP 版本].下载 ...

  3. Linux安全基础:shell及一些基础命令

    1.什么是shell?Shell是用户和Linux操作系统之间的接口.Linux中有多种shell,其中缺省使用的是Bash. 2.shell的分类(1)bash bash shell 是 Bourn ...

  4. IOS开发基础知识--碎片19

    1:键盘事件顺序 UIKeyboardWillShowNotification // 键盘显示之前 UIKeyboardDidShowNotification // 键盘显示完成后 UIKeyboar ...

  5. Android app被系统kill的场景

    何时发生 当我们的app被切到后台的时候,比如用户按下了home键或者切换到了别的应用,总之是我们的app不再和用户交互了,这个时候对于我们的app来说就是什么事情都可能发生的时候了,因为系统会认为你 ...

  6. 【Lucene】三个高亮显示模块的简单示例-Highlighter

    Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter 这里的三个示例都是使用Highlighter: 示例代码: package c ...

  7. ThinkPHP3快速入门教程二:数据CURD

    CURD(创建[Create].更新[Updata].读取[Read].删除[Delete]),定义了用于处理数据的基本原子操作. CURD在具体的应用中并非一定使用create.updata.rea ...

  8. border 外边框

    语法: border:<line-width> || <line-style> || <color> <line-width> = <length ...

  9. Linux(RHEL6.0)下安装GCC

    查看系统版本 [root@CP-RHEL proc]# cat /etc/issue Red Hat Enterprise Linux Server release 6.0 (Santiago) Ke ...

  10. Linux服务器oraclejdk与openjdk共存并配置JavaEE开发环境

    由于本人学业的需要,需要在linux中搭建JavaEE开发环境,与windows的同学协同开发. JDK 由于fedora默认使用openjdk,移除多多少少会出现点问题,由于很多开源软件默认使用到它 ...