WPF:スライダーがMouseLeftButtonDownまたはMouseLeftButtonUpを発生させない

StackOverflow https://stackoverflow.com/questions/160995

  •  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)
ティックをオンにした

バージョン。イベントが以前に処理されたことを確認してください。そうしないと、スライダーがクリックされたと思ったエッジケースになりますが、それは本当にダニでした。プレビューイベントへの登録はさらに悪くなります-ティック間の空白スペースでさえ、どこでもイベントをピックアップします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top