RangeSlider控件用于在一个指定上下限的范围中选择一个数值范围,因此该控件的Maximum和Minimum属性用于指定上下限;而SelectionStart和SelectionEnd用于指定选择的范围,还有一个Change属性用于指定SelectionStart和SelectionEnd的最小变化值。运行效果如下图所示。默认样式很难看,不过定制一个漂亮的样式很简单。
以下是控件的默认样式:
<Style TargetType="{ x:Type local:RangeSlider}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{ x:Type local:RangeSlider}">
<Border BorderBrush="{ TemplateBinding BorderBrush}"
BorderThickness="{ TemplateBinding BorderThickness}"
Background="{ TemplateBinding Background}"
SnapsToDevicePixels="{ TemplateBinding SnapsToDevicePixels}">
<Grid Name="PART_GridContainerName">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<RepeatButton Grid.Column="0" Command="{ x:Static local:RangeSlider.MoveBackward}"/>
<RepeatButton Grid.Column="2" Command="{ x:Static local:RangeSlider.MoveForward}"/>
<Grid Grid.Column="1">
<Thumb Name="PART_LeftThumb" IsTabStop="False" Cursor="SizeWE" Width="5" Margin="-5 0 00" HorizontalAlignment="Left"/>
<Thumb Name="PART_CenterThumb" IsTabStop="False" Cursor="ScrollAll" MinWidth="5"/>
<Thumb Name="PART_RightThumb" IsTabStop="False" Cursor="SizeWE" Width="5" Margin="0 0 -50" HorizontalAlignment="Right"/>
</Grid>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
从控件的样式中可以看出,三个Thumb分别支持拖动改变开始值,结束值和同时改变两个值。两个RepeatButton支持按最小变化值同时改变开始值和结束值;按下Ctl键和左右箭头可达到相同的目的。
RangeSlider控件还实现了SelectedRangeChanged路由事件,这样就可以在SelectionStart和SelectionEnd改变的时候发出事件通知。
RangeSlider控件还支持命令;也就是说它实现了ICommandSource接口,这样就可以和MVVM模式很好的结合起来。剩下也没什么好说的了,代码贴上:
using System;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Controls;
usingSystem.Windows;
usingSystem.Windows.Input;
usingSystem.Windows.Controls.Primitives;
usingSystem.ComponentModel;
namespace MySolution.Controls
{
[TemplatePart(Name = GridContainerName, Type = typeof(Grid))]
[TemplatePart(Name = LeftThumbName, Type = typeof(