我经常想要一个 WPF
Slider
控件,其行为类似于旧的 System.Windows.Forms.TrackBar
。也就是说,我想要一个从 X 到 Y 的滑块,但只允许用户将其移动到离散整数位置。
既然
Value
上的 Slider
属性是 double
,如何在 WPF 中执行此操作?
简单的答案是您利用 IsSnapToTickEnabled 和 TickFrequency 属性。也就是说,打开捕捉到刻度并将刻度频率设置为 1。
或者,换句话说...利用刻度...但您不一定必须显示要捕捉到的刻度。
查看以下 xaml 片段:
<Slider
Orientation="Vertical"
Height="200"
Minimum="0"
Maximum="10"
Value="0"
IsSnapToTickEnabled="True"
TickFrequency="1"
/>
如果您以正确的方式设置刻度线,则可以使用IsSnapToTickEnabled。这对我来说效果很好。有关详细信息,请参阅MSDN。
对于那些想要捕捉到特定位置的人,您还可以使用
Ticks
属性:
<Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />
快照技巧很方便,但有局限性,例如,如果您只想显示有效报价的子集。我已经成功地采用了两种替代方法:绑定到整数或舍入新值。这是一个组合示例:
public int MyProperty { get; set; }
private void slider1_ValueChanged(object sender,
RoutedPropertyChangedEventArgs<double> e)
{
(sender as Slider).Value = Math.Round(e.NewValue, 0);
}
<Slider
Name="slider1"
TickPlacement="TopLeft"
AutoToolTipPlacement="BottomRight"
ValueChanged="slider1_ValueChanged"
Value="{Binding MyProperty}"
Minimum="0" Maximum="100" SmallChange="1" LargeChange="10"
Ticks="0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100"/>
我不知道两者的性能与快照技巧相比如何,但我没有遇到任何麻烦*。
*如果您也将滑块的值绑定到某种类型的文本字段,您会发现,每隔一段时间,如果使用鼠标,文本字段就会显示小数。如果您同时绑定到 int,空字符串将导致抛出转换异常,从而短暂地使 UI 陷入困境。这些问题还没有严重到让我去寻找解决方案。