WPFスライダーを離散整数位置にのみスナップさせるにはどうすればよいですか?


114

昔のSystem.Windows.Forms.TrackBarのように動作するWPFスライダーが必要になることがよくあります。つまり、XからYに移動するスライダーが必要ですが、ユーザーはそれを離散的な整数の位置にのみ移動できます。

SliderのValueプロパティがdoubleであるため、WPFでこれをどのように行うのですか?

回答:



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

スナップトリックは便利ですが、有効なティックのサブセットのみを表示する場合など、制限があります。私は2つの選択肢で成功しました。整数にバインドするか、新しい値を丸めるかのどちらかです。これを組み合わせた例を次に示します。

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 2013

すごい。気付かなかった…ありがとう!
JLott

これは、IsSnapToTickEnabledプロパティがないSilverlightで機能します。
ΩmegaMan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.