我经常想要一个WPF滑块,它的行为就像旧的System.Windows.Forms.TrackBar。也就是说,我想要一个从X到Y的滑块,但只允许用户将其移动到离散的整数位置。
既然Slider上的Value属性是双的,那么在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。这些问题还不够严重,我无法寻找解决方案。