WPF: Slider doesnt raise MouseLeftButtonDown or MouseLeftButtonUp

拈花ヽ惹草 提交于 2019-11-30 16:37:19

问题


I tried this XAML:

<Slider Width="250" Height="25" Minimum="0" Maximum="1" MouseLeftButtonDown="slider_MouseLeftButtonDown" MouseLeftButtonUp="slider_MouseLeftButtonUp" />

And this C#:

private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
sliderMouseDown = true;
}

private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
sliderMouseDown = false;
}

The sliderMouseDown variable never changes because the MouseLeftButtonDown and MouseLeftButtonUp events are never raised. How can I get this code to work when a user has the left mouse button down on a slider to have a bool value set to true, and when the mouse is up, the bool is set to false?


回答1:


Sliders swallow the MouseDown Events (similar to the button).

You can register for the PreviewMouseDown and PreviewMouseUp events which get fired before the slider has a chance to handle them.




回答2:


Another way to do it (and possibly better depending on your scenario) is to register an event handler in procedural code like the following:

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

Please note the true argument. It basically says that you want to receive that event even if it has been marked as handled. Unfortunately, hooking up an event handler like this can only be done from procedural code and not from xaml.

In other words, with this method, you can register an event handler for the normal event (which bubbles) instead of the preview event which tunnels (and therefore occur at different times).

See the Digging Deeper sidebar on page 70 of WPF Unleashed for more info.




回答3:


Try using LostMouseCapture and GotMouseCapture.

    private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)

    private void slider_GotMouseCapture(object sender, MouseEventArgs e)

GotMouseCapture fires when the user begins dragging the slider, and LostMouseCapture when he releases it.




回答4:


I'd like to mention that the Slider doesn't quite swallow the entire MouseDown event. By clicking on a tick mark, you can get notified for the event. The Slider won't handle MouseDown events unless they come from the slider's... slider.

Basically if you decide to use the

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

version with the ticks turned on, be sure that the event was handled previously. If you don't you'll end up with an edge case where you thought the slider was clicked, but it was really a tick. Registering for the Preview event is even worse - you'll pick up the event anywhere, even on the white-space between ticks.



来源:https://stackoverflow.com/questions/160995/wpf-slider-doesnt-raise-mouseleftbuttondown-or-mouseleftbuttonup

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!