Вопрос по mouseevent, c#, slider, wpf – WPF: ползунок не вызывает MouseLeftButtonDown или MouseLeftButtonUp

17

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


И это 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   ответа
1

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

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

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

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

4

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

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

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

19

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

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

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

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

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

+1 Спасибо, это работает и в Silverlight 4.0. Aligned
Рад, что это помогло вам! cplotts
Спасибо за это решение. У меня была такая же проблема, и ваш ответ решил ее. Samvel Siradeghyan
Если IsMoveToPointEnabled имеет значение true, ни этот, ни PreviewMouseDown не работают при нажатии на ползунок. Есть идеи, как заставить это работать в таком случае? Etienne Charland
17

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

Причина такого поведения заключается в том, что кнопка обрабатывает событие MouseDown. По умолчанию, если какой-либо элемент управления заявляет, что ониЕсли вы обработали событие, то никто больше не получит уведомление, если он не указал, что он также хочет видеть обработанные события. Michael Brown
Спасибо, я смог использовать событие IsMouseCapturedWithinChanged в сочетании с событиями PreviewMouseLeftButtonUp для достижения моей конечной цели. Nick
Кто-нибудь знает обоснование такого поведения? PeterAllenWebb

Похожие вопросы