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

时间:2008-10-06 01:56:26

标签: wpf controls slider

我常常想要一个WPF滑块,其行为类似于旧的System.Windows.Forms.TrackBar。也就是说,我想要一个从X到Y的滑块,但只允许用户将它移动到离散的整数位置。

如何在WPF中执行此操作,因为Slider上的Value属性是双倍的?

4 个答案:

答案 0 :(得分:160)

简单的答案是您利用 IsSnapToTickEnabled TickFrequency 属性。也就是说,将捕捉变为勾选并将刻度频率设置为1.

或者,换句话说......利用滴答声......但你不一定要显示你正在捕捉的滴答声。

查看下面的xaml:

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

答案 1 :(得分:90)

如果以正确的方式设置刻度线,则可以使用 IsSnapToTickEnabled 。这对我很有用。有关详细信息,请参阅MSDN

答案 2 :(得分:44)

对于那些想要与特定位置对齐的人,您还可以使用Ticks属性:

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

答案 3 :(得分:9)

快照技巧很方便,但有一些限制,例如,如果您只想显示有效刻度的子集。我有两个选择成功:要么绑定整数,要么舍入新值。以下是一个组合示例:

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。这些问题对我来说还不够严重,无法寻找解决方案。