MultiSlider UserControl: A Comprehensive Guide

正如其名称所示,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的点从未被访问或更改。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485