it-swarm.com.de

Wie lässt man einen WPF-Schieberegler nur an diskreten Ganzzahlpositionen ausrichten?

Allzu oft möchte ich einen WPF-Schieberegler, der sich wie die alte System.Windows.Forms.TrackBar verhält. Das heißt, ich möchte einen Schieberegler, der von X nach Y geht, dem Benutzer jedoch nur das Verschieben in diskreten Ganzzahlpositionen ermöglicht.

Wie macht man das in WPF, da die Value-Eigenschaft auf dem Slider doppelt ist?

106
cplotts

Wenn Sie Ihre Häkchen richtig setzen, können Sie IsSnapToTickEnabled verwenden. Das hat bei mir ganz gut geklappt. Siehe MSDN für Details.

90
Brian Stewart

Die einfache Antwort ist, dass Sie die Eigenschaften IsSnapToTickEnabled und TickFrequency nutzen. Schalten Sie also das Einrasten von Häkchen ein und setzen Sie die Häkchenfrequenz auf 1.

Oder mit anderen Worten ... nutzen Sie die Vorteile von Ticks ... aber Sie müssen nicht unbedingt die Ticks anzeigen, an denen Sie gerade fangen.

Schauen Sie sich das folgende Stück xaml an:

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

Für diejenigen, die an bestimmten Positionen einrasten möchten, können Sie auch die Eigenschaft Ticks verwenden:

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

Der Fangtrick ist praktisch, hat aber Einschränkungen, wenn Sie beispielsweise nur eine Teilmenge gültiger Ticks anzeigen möchten. Ich hatte Erfolg mit zwei Alternativen: Entweder binden Sie an eine Ganzzahl oder runden Sie den neuen Wert. Hier ist ein kombiniertes Beispiel:

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"/>

Ich habe keine Ahnung, wie die Leistung von beiden im Vergleich zum Snap-Trick ist, aber ich hatte keine Probleme *.

* Wenn Sie auch den Wert des Schiebereglers an eine Art Textfeld binden, werden Sie feststellen, dass das Textfeld bei Verwendung der Maus von Zeit zu Zeit Dezimalstellen anzeigt. Wenn Sie gleichzeitig auch an ein int binden, wird durch die leere Zeichenfolge eine Konvertierungsausnahme ausgelöst, die die Benutzeroberfläche kurzzeitig beeinträchtigt. Diese Probleme waren für mich nicht schwerwiegend genug, um nach Lösungen zu suchen.

9
mkjeldsen