17

私はこの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に設定されている場合、このコードを機能させるにはどうすればよいですか?

4

4 に答える 4

19

これを行う別の方法 (シナリオによってはより適切な場合もあります) は、次のような手続き型コードでイベント ハンドラーを登録することです。

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

本当の議論に注意してください。基本的に、処理済みとしてマークされている場合でも、そのイベントを受け取りたいと言っています。残念ながら、このようなイベント ハンドラーの接続は、xaml からではなく、手続き型コードからのみ行うことができます。

つまり、このメソッドを使用すると、トンネリングする (したがって異なる時間に発生する) プレビュー イベントの代わりに、通常のイベント (バブルする) のイベント ハンドラーを登録できます。

詳細については、 WPF Unleashedの70 ページにある Digging Deeper サイドバーを参照してください。

于 2008-10-03T21:09:30.310 に答える
18

スライダーは、MouseDown イベントを飲み込みます (ボタンと同様)。

スライダーがそれらを処理する前に発生する PreviewMouseDown および PreviewMouseUp イベントに登録できます。

于 2008-10-02T05:43:40.417 に答える
1

SliderがMouseDownイベント全体を完全に飲み込むわけではないことを述べておきたいと思います。チェックマークをクリックすると、イベントの通知を受け取ることができます。スライダーの...スライダーから発生しない限り、スライダーはMouseDownイベントを処理しません。

基本的にあなたが使用することにした場合

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

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

于 2012-06-09T04:31:23.717 に答える