WPF: слайдер не вызывает MouseLeftButtonDown или MouseLeftButtonUp

Я пробовал этот XAML:

<Slider Width="250" Height="25" Minimum="0" Maximum="1" MouseLeftButtonDown="slider_MouseLeftButtonDown" MouseLeftButtonUp="slider_MouseLeftButtonUp" />

и это C#:

private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
sliderMouseDown = true;
}

private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
sliderMouseDown = false;
}

переменная sliderMouseDown никогда не изменяется, поскольку события MouseLeftButtonDown и MouseLeftButtonUp никогда не вызываются. Как я могу заставить этот код работать, когда у пользователя есть левая кнопка мыши на ползунке, чтобы значение bool было установлено в true, а когда мышь поднята, bool установлен в false?

4 ответов


ползунки проглатывают события MouseDown (похожие на кнопку).

вы можете зарегистрироваться для событий PreviewMouseDown и PreviewMouseUp, которые запускаются до того, как слайдер сможет их обработать.


другой способ сделать это (и, возможно, лучше, в зависимости от вашего сценария), чтобы зарегистрировать обработчик событий в процедурном коде следующим образом:

this.AddHandler
(
    Slider.MouseLeftButtonDownEvent,
    new MouseButtonEventHandler(slider_MouseLeftButtonDown),
    true
);

Пожалуйста, обратите внимание на истинный аргумент. в основном говорится, что вы хотите получить это событие, даже если оно было отмечено как обработанное. к сожалению, подключение такого обработчика событий можно выполнить только из процедурного кода, а не из xaml.

другими словами, с помощью этого метода можно зарегистрировать обработчик событий для обычного события (которое пузырится) вместо события предварительного просмотра, которое туннелирует (и, следовательно, происходит в разное время).

см. боковую панель "копать глубже" на стр. 70 WPF Unleashed для получения дополнительной информации.


попробуйте использовать LostMouseCapture и GotMouseCapture.

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

GotMouseCapture срабатывает, когда пользователь начинает перетаскивать ползунок, и LostMouseCapture, когда он отпускает ее.


Я хотел бы отметить, что слайдер не совсем поглощает все событие MouseDown. Нажав на галочку, вы can получить уведомление о событии. Слайдер не будет обрабатывать события MouseDown, если они не поступают из слайдера... ползунок.

в основном, если вы решите использовать

AddHandler(Slider.MouseLeftButtonDownEvent, ..., true)

версия с включенными тиками, убедитесь, что событие было обработано ранее. Если вы этого не сделаете, вы получите крайний случай, когда вы думали, что слайдер был щелчок, но это был действительно ТИК. Регистрация на событие предварительного просмотра еще хуже - вы подберете событие в любом месте, даже на белом пространстве между тиками.