คุณจะสร้างสแน็ปเลื่อน WPF เฉพาะตำแหน่งจำนวนเต็มที่ไม่ต่อเนื่องได้อย่างไร


114

บ่อยครั้งที่ฉันต้องการตัวเลื่อน WPF ที่ทำงานเหมือน System.Windows.Forms.TrackBar เก่า นั่นคือฉันต้องการตัวเลื่อนที่เปลี่ยนจาก X ไป Y แต่อนุญาตให้ผู้ใช้ย้ายได้ในตำแหน่งจำนวนเต็มไม่ต่อเนื่อง

เราจะทำสิ่งนี้ใน WPF ได้อย่างไรเนื่องจากคุณสมบัติ Value บน Slider เป็นสองเท่า

คำตอบ:


95

หากคุณตั้งเครื่องหมายเห็บของคุณในทางที่ถูกที่คุณสามารถใช้IsSnapToTickEnabled สิ่งนี้ได้ผลดีสำหรับฉัน ดูMSDNสำหรับรายละเอียด


172

คำตอบง่ายๆคือคุณใช้ประโยชน์จากIsSnapToTickEnabledและTickFrequencyคุณสมบัติ นั่นคือเปิดสแนปเป็นเห็บและตั้งความถี่เห็บเป็น 1

หรืออีกนัยหนึ่ง ... ใช้ประโยชน์จากเห็บ ... แต่คุณไม่จำเป็นต้องแสดงเห็บที่คุณกำลังหัก

ตรวจสอบ xaml ชิ้นต่อไปนี้:

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

1
คำตอบนี้ควรเป็นคำตอบที่ได้รับการยอมรับ ใช้งานได้เหมือนมีเสน่ห์ ขอบคุณ
Ashbay

ขอบคุณ @Ashbay ... ในเวลานั้นฉันต้องการให้เครดิตคนอื่นสำหรับคำตอบ ... แทนที่จะทำเครื่องหมายคำตอบของตัวเองว่ายอมรับแล้ว
cplotts

อยู่ภายใต้หัวข้อ Common ของกล่องโต้ตอบ Properties ใน designer แต่อย่างน้อยในเครื่องของฉันก็ไม่สามารถมองเห็นได้ในทันทีเพราะส่วนย่อยขั้นสูงถูกยุบและทุกอย่างก็ง่ายเกินไปที่จะมองข้าม
amonroejj

46

สำหรับผู้ที่ต้องการสแนปไปยังตำแหน่งเฉพาะคุณยังสามารถใช้Ticksคุณสมบัติ:

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

10

เคล็ดลับสแน็ปมีประโยชน์ แต่มีข้อ จำกัด เช่นหากคุณต้องการแสดงเฉพาะบางส่วนของเห็บที่ถูกต้อง ฉันประสบความสำเร็จกับสองทางเลือก: ผูกกับจำนวนเต็มหรือปัดเศษค่าใหม่ นี่คือตัวอย่างรวม:

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

โอ้เรียบร้อย ฉันไม่รู้ว่า ... ขอบคุณ!
JLott

สิ่งนี้ใช้ได้กับ Silverlight ที่ไม่มีIsSnapToTickEnabledทรัพย์สิน
ΩmegaMan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.