127

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

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

4

4 回答 4

185

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

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

查看以下 xaml:

<Slider
    Orientation="Vertical"
    Height="200"
    Minimum="0"
    Maximum="10"
    Value="0"
    IsSnapToTickEnabled="True"
    TickFrequency="1"
/>
于 2008-10-06T02:10:02.823 回答
106

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

于 2008-10-06T02:10:51.293 回答
48

对于那些想要捕捉到特定位置的人,您还可以使用以下Ticks属性:

<Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />
于 2011-08-14T15:04:19.130 回答
12

snap 技巧很方便,但也有局限性,例如,如果您只想显示有效报价的子集。我已经通过两种选择取得了成功:绑定到整数或舍入新值。这是一个组合示例:

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

于 2012-12-19T23:36:49.847 回答