2008-10-02 6 views
14

Я попробовал этот код XAML:WPF: Slider оленья кожа поднять MouseLeftButtonDown или MouseLeftButtonUp

<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?

ответ

14

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

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

+0

Спасибо, я смог использовать событие IsMouseCapturedWithinChanged в сочетании с событиями PreviewMouseLeftButtonUp для достижения моей конечной цели. – Nick 2008-10-02 05:51:32

+0

Кто-нибудь знает причину такого поведения? – PeterAllenWebb 2008-11-03 18:47:42

16

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

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

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

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

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

1

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

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

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, когда он отпускает его.

 Смежные вопросы

  • Нет связанных вопросов^_^