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


114

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

由于滑块上的Value属性是double的,因此在WPF中该怎么做?

Answers:


95

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


172

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

或者,换句话说,就是……利用刻度线……但是您不必一定要显示要捕捉的刻度线。

查看以下xaml:

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

1
这个答案应该是公认的。奇迹般有效。谢谢
Ashbay

谢谢@Ashbay…当时,我想给其他人功劳…而不是仅仅将我自己的答案标记为已接受。
cplotts 2013年

它位于设计器中“属性”对话框的“公用”部分下,但是至少在我的机器上,由于“高级”子部分已折叠并且很容易被忽略,因此无法立即看到。
amonroejj

46

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

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

10

捕捉技巧很方便,但是有局限性,例如,如果您只想显示有效滴答的子集。我在两种选择上都取得了成功:绑定到整数或舍入新值。这是一个组合的示例:

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


因此,这是否允许用户在滑块上也具有其他值?还是只允许选择报价的值。有点奇怪的问题……希望您能理解我的要求。
JLott

1
@JLott:您仍然只能捕捉到Ticks值(0,10,20 ,...),但是中间的所有值(1、2,...)都是有效的,并且可以使用例如箭头键进行选择。
mkjeldsen

真好 我没有意识到...谢谢!
JLott

这适用于没有IsSnapToTickEnabled属性的Silverlight 。
ΩmegaMan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.