Làm cách nào để bạn tạo một thanh trượt WPF chỉ chụp vào các vị trí số nguyên rời rạc?


114

Tôi thường xuyên muốn một thanh trượt WPF hoạt động giống như System.Windows.Forms.TrackBar cũ. Đó là, tôi muốn một thanh trượt đi từ X đến Y nhưng chỉ cho phép người dùng di chuyển nó ở các vị trí số nguyên rời rạc.

Làm cách nào để thực hiện điều này trong WPF vì thuộc tính Giá trị trên Thanh trượt là gấp đôi?

Câu trả lời:


95

Nếu bạn đặt dấu tích của mình đúng cách, bạn có thể sử dụng IsSnapToTickEnabled . Điều này làm việc khá tốt cho tôi. Xem MSDN để biết chi tiết.


172

Câu trả lời đơn giản là bạn tận dụng các thuộc tính IsSnapToTickEnabledTickFrequency . Đó là, bật tính năng bắt dấu tích và đặt tần số đánh dấu thành 1.

Hay nói cách khác ... tận dụng lợi thế của bọ ve ... nhưng bạn không nhất thiết phải chỉ ra những con bọ ve mà bạn đang bắt.

Kiểm tra phần sau của xaml:

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

1
Câu trả lời này nên được chấp nhận. Hoạt động như một sự quyến rũ. Cảm ơn
Ashbay

Cảm ơn @Ashbay ... tại thời điểm đó, tôi muốn ghi công cho người khác cho câu trả lời ... thay vì chỉ đánh dấu câu trả lời của riêng tôi là được chấp nhận.
cplotts

Nó nằm trong phần Chung của hộp thoại Thuộc tính trong trình thiết kế, nhưng trên máy của tôi, ít nhất, nó không hiển thị ngay lập tức vì tiểu mục Nâng cao đã bị thu gọn và tất cả đều quá dễ dàng để bỏ qua.
amonroejj 19/09/19

46

Đối với những người muốn bắt kịp các vị trí cụ thể , bạn cũng có thể sử dụng thuộc Tickstính:

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

10

Thủ thuật snap rất tiện dụng nhưng có những hạn chế, chẳng hạn như nếu bạn muốn chỉ hiển thị một tập hợp con các tick hợp lệ. Tôi đã thành công với hai lựa chọn thay thế: hoặc liên kết với một số nguyên hoặc làm tròn giá trị mới. Đây là một ví dụ kết hợp:

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

Tôi không biết hiệu suất của cả hai như thế nào so với thủ thuật chụp nhanh nhưng tôi không gặp bất kỳ khó khăn nào *.

* Nếu bạn cũng liên kết giá trị của thanh trượt với một loại trường văn bản, bạn sẽ thấy rằng, thỉnh thoảng nếu sử dụng chuột, trường văn bản sẽ hiển thị số thập phân. Nếu bạn cũng liên kết với một int đồng thời, chuỗi trống sẽ khiến một ngoại lệ chuyển đổi được ném ra khiến giao diện người dùng bị sa lầy trong thời gian ngắn. Những vấn đề này chưa đủ nghiêm trọng để tôi tìm kiếm giải pháp.


Vì vậy, điều này có cho phép người dùng cũng có các giá trị khác trên thanh trượt không? Hay nó vẫn chỉ cho phép chọn giá trị của số tick. Một câu hỏi kỳ lạ ... hy vọng bạn hiểu những gì tôi đang hỏi.
JLott

1
@JLott: Bạn vẫn chỉ có thể chụp vào các Ticksgiá trị (0, 10, 20, ...) nhưng tất cả các giá trị ở giữa (1, 2, ...) đều hợp lệ và có thể được chọn bằng các phím mũi tên, ví dụ.
mkjeldsen

Ồ, gọn gàng. Tôi đã không nhận ra rằng ... Cảm ơn!
JLott

Điều này hoạt động cho Silverlight nơi không có IsSnapToTickEnabledtài sản.
ΩmegaMan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.