WPF: Slider does not raise MouseLeftButtonDown ou MouseLeftButtonUp
-
03-07-2019 - |
Pergunta
Eu tentei isso XAML:
<Slider Width="250" Height="25" Minimum="0" Maximum="1" MouseLeftButtonDown="slider_MouseLeftButtonDown" MouseLeftButtonUp="slider_MouseLeftButtonUp" />
E este C #:
private void slider_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
sliderMouseDown = true;
}
private void slider_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
sliderMouseDown = false;
}
A variável sliderMouseDown nunca muda porque os eventos MouseLeftButtonDown e MouseLeftButtonUp nunca são levantadas. Como posso obter este código para o trabalho quando um usuário tem o botão esquerdo do mouse em um controle deslizante para ter um conjunto valor booleano para true, e quando o mouse está acima, o bool é definido como falso?
Solução
Sliders andorinha os eventos MouseDown (semelhante ao botão).
Você pode se inscrever para os eventos PreviewMouseDown e PreviewMouseUp que são demitidos antes do controle deslizante tem a chance de lidar com eles.
Outras dicas
Outra maneira de fazê-lo (e possivelmente melhor dependendo do cenário) é para registrar um manipulador de eventos no código processual como o seguinte:
this.AddHandler
(
Slider.MouseLeftButtonDownEvent,
new MouseButtonEventHandler(slider_MouseLeftButtonDown),
true
);
Por favor, note o verdadeiro argumento. É basicamente diz que você deseja receber esse evento, mesmo que tenha sido marcado como manipulado. Infelizmente, ligar um manipulador de eventos como esse só pode ser feito a partir do código processual e não de XAML.
Em outras palavras, com este método, você pode registrar um manipulador de eventos para o evento normal (que bolhas) em vez do evento de visualização que túneis (e, portanto, ocorrer em momentos diferentes).
Veja a barra lateral Mais Fundo Indo na página 70 da WPF desencadeada para mais informações.
Tente usar LostMouseCapture e GotMouseCapture.
private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)
private void slider_GotMouseCapture(object sender, MouseEventArgs e)
GotMouseCapture é acionado quando o usuário começa a arrastar o controle deslizante e LostMouseCapture quando ele libera-lo.
Eu gostaria de mencionar que o Slider não chega a engolir todo o evento MouseDown. Ao clicar em uma marcação, você pode ser notificado para o evento. O Slider não vai lidar com eventos MouseDown a menos que eles vêm do controle deslizante ... slider.
Basicamente, se você decidir usar o
AddHandler(Slider.MouseLeftButtonDownEvent, ..., true)
Versão com os carrapatos ligado, certifique-se de que o evento foi tratado anteriormente. Se você não fizer isso você vai acabar com um caso extremo em que você pensou que o controle deslizante foi clicado, mas foi realmente um carrapato. Registrar para o evento Preview é ainda pior -. Você vai pegar a qualquer evento, mesmo no espaço em branco entre os carrapatos