WPF: слайдер не увеличивает MouseLeftButtonDown или MouseLeftButtonUp

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

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

И этот С#:

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?

Ответы

Ответ 1

Слайдеры проглатывают события MouseDown (аналогично кнопке).

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

Ответ 2

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

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

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

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

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

Ответ 3

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

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

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

Ответ 4

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

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

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

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