Wie lässt man einen WPF-Schieberegler nur an diskreten ganzzahligen Positionen fangen?

114

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 wechselt, dem Benutzer jedoch nur das Verschieben in diskrete ganzzahlige Positionen ermöglicht.

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

cplotts
quelle

Antworten:

95

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

Brian Stewart
quelle
172

Die einfache Antwort lautet, dass Sie die Eigenschaften IsSnapToTickEnabled und TickFrequency nutzen . Schalten Sie das Einrasten ein, um die Zecken zu aktivieren, und stellen Sie die Zeckenfrequenz auf 1 ein.

Oder mit anderen Worten ... nutzen Sie Zecken ... aber Sie müssen nicht unbedingt die Zecken zeigen, an denen Sie 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"
/>
cplotts
quelle
1
Diese Antwort sollte akzeptiert werden. Klappt wunderbar. Vielen Dank
Ashbay
Danke @Ashbay ... zu der Zeit wollte ich jemand anderem die Antwort zuschreiben ... anstatt nur meine eigene Antwort als akzeptiert zu markieren.
Plots
Es befindet sich im Designer im Abschnitt "Allgemein" des Dialogfelds "Eigenschaften", aber auf meinem Computer war es zumindest nicht sofort sichtbar, da der Unterabschnitt "Erweitert" reduziert und nur allzu leicht zu übersehen war.
Amonroejj
46

Für diejenigen, die an bestimmten Positionen fangen möchten , können Sie auch die TicksEigenschaft verwenden:

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

Der Snap-Trick ist praktisch, weist jedoch Einschränkungen auf, z. B. wenn Sie nur eine Teilmenge gültiger Ticks anzeigen möchten. Ich hatte Erfolg mit zwei Alternativen: entweder an eine ganze Zahl binden oder den neuen Wert runden. 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 bind der Wert des Schiebers auf eine Art von Textfeld erleben Sie , dass jeder einmal in einer Weile mit der Maus , wenn verwendet, wird das Textfeld Dezimalstellen zeigen. Wenn Sie gleichzeitig auch an ein int binden, wird durch die leere Zeichenfolge eine Konvertierungsausnahme ausgelöst, die die Benutzeroberfläche kurzzeitig blockiert. Diese Probleme waren nicht schwerwiegend genug, um nach Lösungen zu suchen.

mkjeldsen
quelle
Ermöglicht dies dem Benutzer also, auch die anderen Werte auf dem Schieberegler zu haben? Oder lässt es immer noch nur zu, dass der Wert der Ticks ausgewählt wird. Eine seltsame Frage ... hoffentlich verstehst du, was ich frage.
JLott
1
@JLott: Sie können immer noch nur an den TicksWerten (0, 10, 20, ...) fangen , aber alle dazwischen liegenden Werte (1, 2, ...) sind gültig und können mit z. B. Pfeiltasten ausgewählt werden.
Mkjeldsen
Oh ordentlich. Das habe ich nicht bemerkt ... Danke!
JLott
Dies funktioniert für Silverlight, wo keine IsSnapToTickEnabledEigenschaft vorhanden ist.
ΩmegaMan