Bir WPF kaydırıcısını yalnızca ayrı tam sayı konumlarına nasıl yapıştırırsınız?


114

Çoğu zaman eski System.Windows.Forms.TrackBar gibi davranan bir WPF kaydırıcısı istiyorum. Yani, X'ten Y'ye giden ancak kullanıcının onu ayrı tam sayı konumlarında hareket ettirmesine izin veren bir kaydırıcı istiyorum.

Slider'daki Value özelliği çift olduğu için WPF'de bu nasıl yapılır?

Yanıtlar:


95

Onay işaretlerinizi doğru şekilde ayarlarsanız, IsSnapToTickEnabled'ı kullanabilirsiniz . Bu benim için oldukça iyi çalıştı. Ayrıntılar için MSDN'ye bakın.


172

Basit cevap, IsSnapToTickEnabled ve TickFrequency özelliklerinden yararlanmanızdır. Yani, tıklamaları açık konuma getirin ve tıklama sıklığını 1 olarak ayarlayın.

Ya da, başka bir deyişle ... kenelerden yararlanın ... ancak yapıştırdığınız keneleri göstermeniz gerekmiyor.

Aşağıdaki xaml parçasına göz atın:

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

1
Bu cevap kabul edilen cevap olmalıdır. Tıkır tıkır çalışıyor. Teşekkürler
Ashbay

Teşekkürler @ Ashbay ... o zaman, sadece kendi cevabımı kabul edilmiş olarak işaretlemek yerine, cevabı başkasına vermek istedim.
cplotts

Bu, tasarımcıdaki Özellikler iletişim kutusunun Ortak bölümünün altında, ancak en azından benim makinemde, Gelişmiş alt bölüm daraltıldığı ve gözden kaçması çok kolay olduğu için hemen görünmüyordu.
amonroejj

46

Belirli konumlara takılmak isteyenler için Ticksözelliği de kullanabilirsiniz :

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

10

Snap hilesi kullanışlıdır, ancak sınırlamaları vardır, örneğin yalnızca geçerli işaretlerin bir alt kümesini göstermek istiyorsanız. İki alternatifle başarılı oldum: ya bir tam sayıya bağlan ya da yeni değeri yuvarla. İşte birleşik bir örnek:

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

Her ikisinin de performansının anlık hile ile karşılaştırılması hakkında hiçbir fikrim yok ama herhangi bir sorun yaşamadım *.

* Kaydırıcının değerini bir tür metin alanına da bağlarsanız, fareyi kullanıyorsanız, arada bir, metin alanında ondalık sayılar göstereceğini göreceksiniz. Aynı zamanda bir int'e bağlanırsanız, boş dize, kullanıcı arayüzünü kısa süreliğine tıkayan bir dönüştürme istisnasının atılmasına neden olur. Bu sorunlar benim çözüm aramam için yeterince ciddi olmadı.


Peki bu, kullanıcının kaydırıcıda diğer değerlere sahip olmasına izin veriyor mu? Yoksa hala yalnızca kenelerin değerinin seçilmesine izin veriyor mu? Garip bir soru ... umarım ne sorduğumu anlarsın.
JLott

1
@JLott: Yine de yalnızca Ticksdeğerlere (0, 10, 20, ...) yaslayabilirsiniz , ancak aradaki tüm değerler (1, 2, ...) geçerlidir ve örneğin ok tuşları ile seçilebilir.
mkjeldsen

Oh temiz. Farkında değildim ... Teşekkürler!
JLott

Bu, IsSnapToTickEnabledmülkün olmadığı Silverlight için geçerlidir .
ΩmegaMan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.