Ответ 1
Слайдеры проглатывают события MouseDown (аналогично кнопке).
Вы можете зарегистрироваться для событий PreviewMouseDown и PreviewMouseUp, которые запускаются, прежде чем ползунок сможет обработать их.
Я пробовал этот 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?
Слайдеры проглатывают события MouseDown (аналогично кнопке).
Вы можете зарегистрироваться для событий PreviewMouseDown и PreviewMouseUp, которые запускаются, прежде чем ползунок сможет обработать их.
Другой способ сделать это (и, возможно, лучше в зависимости от вашего сценария) - зарегистрировать обработчик событий в процедурном коде, как показано ниже:
this.AddHandler
(
Slider.MouseLeftButtonDownEvent,
new MouseButtonEventHandler(slider_MouseLeftButtonDown),
true
);
Обратите внимание на истинный аргумент. В основном говорится, что вы хотите получить это событие, даже если оно было помечено как обработано. К сожалению, подключение такого обработчика событий может быть выполнено только из процедурного кода, а не из xaml.
Другими словами, с помощью этого метода вы можете зарегистрировать обработчик событий для обычного события (которое пузырится) вместо события предварительного просмотра, которое туннелирует (и, следовательно, происходит в разное время).
Для получения дополнительной информации см. боковую панель Digging Deeper на стр. 70 WPF Unleashed.
Попробуйте использовать LostMouseCapture и GotMouseCapture.
private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)
private void slider_GotMouseCapture(object sender, MouseEventArgs e)
GotMouseCapture срабатывает, когда пользователь начинает перетаскивать ползунок и LostMouseCapture, когда он его отпускает.
Я хотел бы упомянуть, что Slider не совсем поглощает все события MouseDown. Нажимая на отметку, вы можете получить уведомление о мероприятии. Ползунок не будет обрабатывать события MouseDown, если они не входят в слайдер слайдера.
В принципе, если вы решите использовать
AddHandler(Slider.MouseLeftButtonDownEvent, ..., true)
с включенными галочками, убедитесь, что событие было обработано ранее. Если вы этого не сделаете, у вас будет краевой кейс, в котором вы решили щелкнуть слайдер, но это был действительно тик. Регистрация для события "Предварительный просмотр" еще хуже - вы сможете увидеть событие где угодно, даже в белом пространстве между тиками.