WPF: ползунок не вызывает MouseLeftButtonDown или MouseLeftButtonUp - PullRequest
17 голосов
/ 02 октября 2008

Я пробовал этот 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 ]

19 голосов
/ 04 октября 2008

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

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

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

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

См. Дополнительную информацию на боковой панели «Копание глубже» на стр. 70 WPF Unleashed .

17 голосов
/ 02 октября 2008

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

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

4 голосов
/ 15 января 2015

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

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

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

1 голос
/ 09 июня 2012

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

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

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

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

...