ВПФ:Ползунок не поднимает MouseLeftButtonDown или MouseLeftButtonUp.

StackOverflow https://stackoverflow.com/questions/160995

  •  03-07-2019
  •  | 
  •  

Вопрос

Я попробовал этот 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 никогда не возникают.Как заставить этот код работать, когда пользователь нажимает левую кнопку мыши на ползунке, чтобы для логического значения было установлено значение true, а когда мышь поднята, для логического значения установлено значение false?

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top