WPF MultiRangeSlider 简单实现
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 一个简单的颜色选择器
原文:WPF 一个简单的颜色选择器 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/BYH371256/article/details/8340999 ...
- WPF自学入门(十一)WPF MVVM模式Command命令 WPF自学入门(十)WPF MVVM简单介绍
WPF自学入门(十一)WPF MVVM模式Command命令 在WPF自学入门(十)WPF MVVM简单介绍中的示例似乎运行起来没有什么问题,也可以进行更新.但是这并不是我们使用MVVM的正确方式 ...
- [Songqw.Net 基础]WPF实现简单的插件化开发
原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/ar ...
- WPF MvvmLight简单实例(1) 页面导航
原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击“Load”按钮,页面会加载PageOne,点击PageOne页面中的“Next” ...
- WPF自学入门(十)WPF MVVM简单介绍
前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...
- WPF 最简单的TextBox水印
最简单的TextBox加水印的方法,但是不具有很强的通用性. 如果你只是使用一次,或者用的不多,偷偷懒可以使用. 因为此方法只需要修改TextBox的Template,而不用重写何任代码. 注意: 1 ...
- WPF 实现简单的跑马灯
本文用WPF的动画实现一个简单的跑马灯 xmal: <Window x:Class="wpfstatusBar.MainWindow" xmlns="http:// ...
- WPF MVVM简单介绍
前面文章中,我们已经知道,WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的,WPF提供了数据绑定机制,当数据发生变化时,WPF会自动发出通知去更新UI. 我们不管 ...
- WPF绘制简单常用的Path
写代码出身的我们经常需要使用一些简单 但是不是规则图形的Path 但限于美工功底有限 不知道怎么去画 下面我告诉大家一些简单的小技巧 用代码来画Path 个人还是比较喜欢用代码 因为数值控制的更精细 ...
随机推荐
- 【grunt整合版】30分钟学会使用grunt打包前端代码
grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...
- iOS UITabBarController的使用
UITabBarController 和 UINavigationController 几乎是iOS APP的标配. UITabBarController分栏(标签栏)控制器, 和UINavigati ...
- IBM实习
来到北京,进入IBM实习已经好多天了,两个月的暑假,两个月夏日在这里度过了,并将在未来个一个月里面,仍将在这里走过,但是我却一无所成,现在仍然只在徘徊中游走,丹迪什么时候能真正懂得实习的难得可贵,懂得 ...
- SharePoint 2013 自定义扩展菜单
在对SharePoint进行开发或者功能扩展的时候,经常需要对一些默认的菜单进行扩展,以使我们开发的东西更适合SharePoint本身的样式.SharePoint的各种功能菜单,像网站设置.Ribbo ...
- 基础理解2:CSS3按钮动画
一个Css3按钮效果很好,仔细看了一下发现就是::after,::before然后加上transition,transform等效果实现,主要关注一下几点就能轻松实现: 1.伪类需要position定 ...
- HttpUrlConnection
•HttpUrlConnection是java的标准类,继承UrlConnection类,二者都是抽象类.其对象主要通过URL的 ...
- 遇到别人留下的storyboard的,你需要一个引导图,但是不知道怎么跳转.
首先在AppDeledate.m文件里是这样. { self.window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds] ...
- spring mvc生成注册验证码
通过Spring MVC为系统添加验证码 1:布局登陆页面,用户名,密码,填写验证码的文本框,及验证码的图片及点击换图 <%@ taglib prefix="c" uri=& ...
- 代替Reflection(反射)的一些方法
Reflection(反射)是深入学习.Net必须掌握的技能之一.最初学Reflection的时候,的确是被惊住了,原来还可以这样.只要给你一个Assembly, 你就能获取到其中所有的类型,根据类型 ...
- android edittext属性说明
将EditText内容转换为字符串: EditText.getText().toString() <EditText android:id="@+id/edt_month" ...