我经常想要一个 WPF 滑块,表现得像系统。窗户。表格。以前的轨迹栏。也就是说,我想要一个从 X 到 Y 的滑块,但是只允许用户在离散的整数位置移动它。
如何在 WPF 中做到这一点,因为滑块上的 Value 属性是双倍的?
简单的答案是利用 IsSnapToTickEnable和 滴答频率属性。也就是说,打开打拍子并将打拍子的频率设置为1。
或者,换句话说,利用虱子的优势,但是你不一定非要展示你正在抓的虱子。
看看下面这个例子:
<Slider Orientation="Vertical" Height="200" Minimum="0" Maximum="10" Value="0" IsSnapToTickEnabled="True" TickFrequency="1" />
如果您以正确的方式设置您的刻度标记,您可以使用 IsSnapToTickEnable。这招对我很管用。详情请参阅 MSDN。
对于那些想要抓取到 具体点位置的,你也可以使用 Ticks属性:
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 短暂停滞。这些问题还没有严重到让我去寻找解决办法的地步。