正如其名称所示,MultiSlider是一个用户控件,能够在一个滑块轨道上显示多个箭头。保留了标准的Slider控件的大部分行为和外观,并增加了一些细微的增强功能。用户可以通过在滑块轨道上双击来添加新的箭头(可选)。用户可以通过Alt+右键单击来删除箭头(可选)。箭头具有一个IsMoveable属性;如果设置为false,则它们既不能移动也不能删除(通过箭头上的彩色装饰圈在视觉上表示)。箭头具有一个IsUser属性;如果设置为true,则用于着色普通箭头的画刷将会不同。用户箭头和标准箭头在其他方面处理相同。AutoToolTipPlacement也得到了考虑。
当使用Tab键或Modifier+光标键在主窗口的控件中进行切换时,如果选择了一个箭头,可以使用Shift+光标键跳过任何相邻的箭头。Tab键不会跳过任何相邻的箭头,而只会跳过控件。当MultiSlider控件被切换到时,按下空格键将激活之前选择的箭头。Control+光标键在切换控件时按正常方式工作。
市面上有一些多滑块工具,例如:
- ,这是2013年的版本,使用的是Windows 7的箭头,所以对于W10风格来说已经过时了。功能有限,尽管可以添加新的箭头。
- ,这个更旧(2007年)。
- ,看起来像是为W7设计的。没有调查这个。
- ,这个固定在只有2个箭头,所以不如所需的灵活,但看起来相当不错。
这些工具都不够全面,所以开发了自己的MultiSlider:
为程序员提供的事件处理非常全面(见下面的规格)。没有包括“刻度”图形和功能(可能会在将来的某个时候添加),但有AutoToolTip功能。
解决方案中有两个项目将演示MultiSlider的实际应用。第一个,TestSimple,只是显示了所有箭头类型和使用覆盖着色的基本信息。第二个,TestMultiSlider,更加全面,包括:
- 用户操作箭头的各种方式的设施
- 改变多滑块状态的开关
- 垂直和水平方向的多滑块
- 在TextBlock中读取用户操作
以下是一些属性:
- AdornerColor - (get/set)用于箭头装饰圈的颜色。如果传递null,则颜色将被重置。
- AdornerRatio - (get/set)设置/获取装饰圈直径与向上箭头宽度的比率。如果传递null,则比率将被重置。
- ArrowAtIndex(int index) - 返回位置'index'(base=0从最小端开始)的ArrowData。
- ArrowCount - (get)滑块轨道中的箭头数量。
- ArrowType - (get/set)MultiSlider.ArrowTypes枚举。值:LeftRight, UpDown或Rect。
- AutoToolTipPlacement - (get/set)相对于箭头放置自动工具提示的位置。
- AutoToolTipPrecision - (get/set)将箭头的值打印为N位小数。
- AutoToolTipSigFigs - (get/set)如果N>0,则以N位有效数字打印箭头的值,并优先于AutoToolTipPrecision。
- CanDelAddArrows - (get/set)用户是否可以使用鼠标添加/删除箭头。
- HelpText - (get)包含基本格式化文本的字符串,为用户提供指令。适合添加到并在MessageBox中显示。
- Minimum - (get/set)滑块轨道中箭头的最小值。设置器会删除所有现有的箭头,并且不会触发ArrowDeleted事件。
- Maximum - (get/set)滑块轨道中箭头的最大值。设置器会删除所有现有的箭头,并且不会触发ArrowDeleted事件。
- Orientation - (get/set)指定滑块轨道的垂直或水平轴。
- ReverseDirection - (get/set)Maximum是在滑块轨道的最大端还是最小端(反之亦然对于Minimum)。
- SchemeOverlayColor - (get, set)在滑块轨道和普通箭头上使用的颜色覆盖。建议alpha=10%。
- SmallChange - (get/set)使用键盘光标键移动时,要添加/减去的当前箭头值的小增量。
- LargeChange - (get/set)使用键盘光标键(+Alt键)移动时,要添加/减去的当前箭头值的大增量。
- Value - (get/set)滑块轨道上第一个箭头的值。如果滑块轨道为空,则返回DoubleNaN;或者忽略滑块轨道进行设置。这在非可删除的单箭头滑块中很有用。
以下是一些方法:
- CreateArrow(double value, bool isUser = false, bool isMoveable = true) - 创建并显示一个新的箭头。返回一个ArrowData。"value">在TrackBar的Minimum和Maximum属性内的值。"isUser"> true: 使用箭头的用户状态画刷。"isMoveable"> false: 箭头既不能移动也不能删除。
- DeleteArrow(int index, bool fireEvent) - 移除'index'(从滑块轨道画布上。base=0从最小端开始)处的箭头。如果'fireEvent' = true,则触发ArrowDeleted事件。
- DeleteAllArrows(bool fireEvent) - 从滑块轨道画布上移除所有箭头。如果'fireEvent' = true,则触发ArrowDeleted事件。
- IsValidValue(value) - 参数是否落在多滑块的Minimum/Maximum值内。
- ValueAtIndex(int index) - 返回有效箭头索引(base 0从最小端开始)在滑块轨道上的值。
以下是一些事件:
- ArrowCreated
- ArrowRightClicked - 如果使用Alt键删除箭头,则不会触发此事件
- ArrowScrolled
- ArrowDeleted - ArrowSelected也会在焦点改变到相邻箭头后触发
- ArrowSelected - 当箭头接收到键盘焦点(例如,被点击或切换到)时触发。所有事件都会传递其sender参数作为(object)ArrowData
箭头(由事件处理程序发送的ArrowData类型):
- Index - (get)Base 0。从最小端开始的第n个箭头在滑块轨道上。
- IsMoveable - (get/set)是否可以移动/删除箭头。可以在事件处理程序中即时完成。
- IsUser - (get/set)只有设置'普通'箭头画刷时使用的画刷不同。可以在事件处理程序中即时完成。
- Value - (get/set)值在{Minimum到Maximum}之间。
实现说明:
如果Minimum==Maximum => 行为有点奇怪但可以接受。
在MultiSlider属性窗口中有一个条件编译符号MULTISLIDER;更改此符号以防止在调试器外部运行Debug版本时控制台输出。
构建MultiSlider控件:
控件首先有一个表示滑块轨道的Canvas(作为一个Border),其大小设置为用户控件的大小。首先添加一个滑块Border控件。这个Border的大小相对于MultiSlider的宽度或高度属性设置。然后,创建并初始化的复合箭头被添加到主滑块Canvas上。
一个箭头由一个Canvas组成,该Canvas被添加到主滑块上;首先添加一个初始化的Polygon描述箭头,然后是一个Ellipse(作为装饰),最后是一个Label(显示AutoToolTip文本)。每当需要改变箭头的视觉位置时,是Canvas相对于主滑块Canvas放置;因此,Polygon的点从未被访问或更改。