WPF:スライダーがMouseLeftButtonDownまたはMouseLeftButtonUpを発生させない
-
03-07-2019 - |
質問
このXAMLを試しました:
<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;
}
MouseLeftButtonDownイベントとMouseLeftButtonUpイベントは発生しないため、sliderMouseDown変数は変更されません。ユーザーがスライダーでマウスの左ボタンを押し下げてブール値をtrueに設定し、マウスを上げたときにブール値をfalseに設定した場合、このコードを機能させるにはどうすればよいですか?
解決
スライダーはMouseDownイベントを飲み込みます(ボタンと同様)。
スライダーがイベントを処理する前に発生するPreviewMouseDownおよびPreviewMouseUpイベントに登録できます。
他のヒント
それを行うもう1つの方法(シナリオによってはより適切な場合もあります)は、次のような手続き型コードでイベントハンドラーを登録することです。
this.AddHandler
(
Slider.MouseLeftButtonDownEvent,
new MouseButtonEventHandler(slider_MouseLeftButtonDown),
true
);
真の引数に注意してください。 基本的に、そのイベントが処理済みとしてマークされている場合でも、そのイベントを受信したいということです。残念ながら、このようなイベントハンドラーは、xamlではなく手続き型コードからのみ接続できます。
つまり、このメソッドを使用すると、トンネルする(したがって異なる時間に発生する)プレビューイベントの代わりに、通常のイベント(バブルする)のイベントハンドラーを登録できます。
詳細については、 WPF Unleashed の70ページにある「Digging Deeper」サイドバーを参照してください。
LostMouseCaptureおよびGotMouseCaptureを使用してみてください。
private void sliderr_LostMouseCapture(object sender, MouseEventArgs e)
private void slider_GotMouseCapture(object sender, MouseEventArgs e)
GotMouseCaptureは、ユーザーがスライダーのドラッグを開始すると起動し、離すとLostMouseCaptureが起動します。
スライダーは、MouseDownイベント全体をまったく飲み込みません。目盛りをクリックすると、イベントの通知を 受け取ることができます。 Sliderは、スライダーの...スライダーからのものでない限り、MouseDownイベントを処理しません。
基本的に、使用することにした場合
AddHandler(Slider.MouseLeftButtonDownEvent, ..., true)
ティックをオンにしたバージョン。イベントが以前に処理されたことを確認してください。そうしないと、スライダーがクリックされたと思ったエッジケースになりますが、それは本当にダニでした。プレビューイベントへの登録はさらに悪くなります-ティック間の空白スペースでさえ、どこでもイベントをピックアップします。