Jak sprawić, by suwak WPF przyciągał tylko dyskretne pozycje liczb całkowitych?

114

Zbyt często chcę suwaka WPF, który zachowuje się jak stary System.Windows.Forms.TrackBar. Oznacza to, że chcę suwaka, który przesuwa się od X do Y, ale pozwala użytkownikowi przesuwać go tylko w dyskretnych pozycjach całkowitych.

Jak można to zrobić w WPF, ponieważ właściwość Value na suwaku jest podwójna?

cplotts
źródło

Odpowiedzi:

95

Jeśli ustawisz znaczniki we właściwy sposób, możesz użyć IsSnapToTickEnabled . U mnie to działało całkiem nieźle. Aby uzyskać szczegółowe informacje, zobacz MSDN .

Brian Stewart
źródło
172

Prosta odpowiedź jest taka, że ​​korzystasz z IsSnapToTickEnabled i TickFrequency . Oznacza to, że włącz przyciąganie do tików i ustaw częstotliwość taktów na 1.

Lub innymi słowy ... wykorzystaj kleszcze ... ale niekoniecznie musisz pokazywać kleszcze, do których się przyciągasz.

Sprawdź następujący fragment XAML:

<Slider
    Orientation="Vertical"
    Height="200"
    Minimum="0"
    Maximum="10"
    Value="0"
    IsSnapToTickEnabled="True"
    TickFrequency="1"
/>
cplotts
źródło
1
Ta odpowiedź powinna być akceptowana. Działa jak marzenie. Dzięki
Ashbay
Dzięki @Ashbay ... w tamtym czasie chciałem przyznać komuś uznanie za odpowiedź ... zamiast po prostu oznaczać własną odpowiedź jako zaakceptowaną.
cplotts
Znajduje się w sekcji Wspólne okna dialogowego Właściwości w projektancie, ale przynajmniej na moim komputerze nie było od razu widoczne, ponieważ podsekcja Zaawansowane została zwinięta i zbyt łatwa do przeoczenia.
amonroejj
46

Dla tych, którzy chcą przyciągać do określonych pozycji, możesz również użyć Tickswłaściwości:

<Slider Minimum="1" Maximum="500" IsSnapToTickEnabled="True" Ticks="1,100,200,350,500" />
Dave
źródło
10

Ta sztuczka przyciągania jest przydatna, ale ma ograniczenia, na przykład jeśli chcesz pokazać tylko podzbiór ważnych tików. Odniosłem sukces z dwiema alternatywami: albo powiązanie z liczbą całkowitą, albo zaokrąglenie nowej wartości. Oto połączony przykład:

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

Nie mam pojęcia, jak wydajność któregokolwiek z nich wypada w porównaniu z trikiem, ale nie miałem żadnych problemów *.

* Jeśli również przypiszesz wartość suwaka do typu pola tekstowego, zauważysz, że co jakiś czas, jeśli używasz myszy, pole tekstowe będzie pokazywać dziesiętne. Jeśli jednocześnie utworzysz powiązanie z intem, pusty ciąg spowoduje zgłoszenie wyjątku konwersji, który na krótko spowalnia interfejs użytkownika. Te problemy nie były na tyle poważne, żebym szukał rozwiązań.

mkjeldsen
źródło
Czy to pozwala użytkownikowi mieć również inne wartości na suwaku? A może nadal pozwala tylko na wybranie wartości kleszczy. Coś dziwnego… mam nadzieję, że rozumiesz, o co pytam.
JLott,
1
@JLott: Nadal możesz przyciągać tylko Tickswartości (0, 10, 20, ...), ale wszystkie wartości pomiędzy (1, 2, ...) są prawidłowe i można je wybrać np. Za pomocą klawiszy strzałek.
mkjeldsen,
Och, fajnie. Nie zdawałem sobie sprawy, że ... Dzięki!
JLott,
Działa to w przypadku Silverlight, gdzie nie ma IsSnapToTickEnabledwłaściwości.
ΩmegaMan