如何使WPF滑块仅捕捉到离散整数位置?

131

经常情况下,我希望WPF滑块的行为方式与旧版的System.Windows.Forms.TrackBar相同。也就是说,我想要一个从X到Y的滑块,但只允许用户在离散的整数位置上移动它。

在WPF中,由于Slider的Value属性是double类型,那么如何实现这一点呢?

4个回答

200
简单的回答是利用 IsSnapToTickEnabledTickFrequency 属性。也就是说,打开到刻度的捕捉并将刻度频率设置为1。

换句话说...利用刻度...但您不一定要显示要捕捉的刻度。

请查看以下 xaml 片段:

<Slider
    Orientation="Vertical"
    Height="200"
    Minimum="0"
    Maximum="10"
    Value="0"
    IsSnapToTickEnabled="True"
    TickFrequency="1"
/>

1
这个答案应该被接受。非常好用。谢谢。 - Ashbay
感谢@Ashbay...当时,我想把答案的功劳归于别人...而不是只标记自己的答案为已接受。 - cplotts
它位于设计器中属性对话框的“常规”部分,但在我的机器上,至少它并不是立即可见的,因为“高级”子部分被折叠起来很容易被忽略。 - amonroejj

107
如果您正确设置了刻度标记,可以使用IsSnapToTickEnabled。这个方法对我来说很有效。有关详细信息,请参见MSDN

50

对于那些想要"吸附"到特定位置的人,还可以使用Ticks属性:

<Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />

12

快照技巧很方便,但也有局限性,例如如果您只想显示有效刻度的子集,则无法做到。我已经尝试了两种替代方法:要么绑定为整数,要么四舍五入新值。这里是一个结合了两种方法的例子:

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"/>
我不知道两者的表现如何与捏合技巧相比,但我没有遇到任何问题*。
*如果你还将滑块的值绑定到文本字段类型,有时会出现小数的情况,特别是使用鼠标时。如果同时绑定到整型,空字符串将导致转换异常被抛出,稍微拖累了用户界面。这些问题对我来说并不严重,所以我没有去寻找解决方案。

这样做是否允许用户在滑块上选择其他值?还是仅允许选择刻度的值。有点奇怪的问题...希望你能理解我的意思。 - JLott
1
@JLott:你仍然只能捕捉到“Ticks”值(0、10、20等),但是所有中间的值(1、2等)都是有效的,可以使用箭头键进行选择。 - mkjeldsen
这适用于 Silverlight,因为它没有“IsSnapToTickEnabled”属性。 - ΩmegaMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接