16

WPF アプリケーションでボタンのシングル クリックとダブル クリックの両方を異なる反応で処理する必要があります。残念ながら、ダブルクリックでは、WPF は 2 回のクリック イベントとダブルクリック イベントを発生させるため、この状況を処理するのは困難です。

タイマーを使用して解決しようとしましたが、成功しませんでした...助けていただければ幸いです。

コードを見てみましょう:

private void delayedBtnClick(object statInfo)
{
    if (doubleClickTimer != null)
        doubleClickTimer.Dispose();
    doubleClickTimer = null;

    this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new VoidDelegate(delegate()
    {
        // ... DO THE SINGLE CLICK ACTION
    }));
}

private void btn_Click(object sender, RoutedEventArgs e)
{
    if (doubleClickTimer == null)
        doubleClickTimer = new Timer(delayedBtnClick, null, System.Windows.Forms.SystemInformation.DoubleClickTime, Timeout.Infinite);
        }
    }
}

private void btnNext_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    if (doubleClickTimer != null)
        doubleClickTimer.Change(Timeout.Infinite, Timeout.Infinite);    // disable it - I've tried it with and without this line
        doubleClickTimer.Dispose();
    doubleClickTimer = null;

    //.... DO THE DOUBLE CLICK ACTION
}

問題は、ダブルクリックで「DOUBLE CLICK ACTION」の後に「SINGLE CLICK ACTION」が呼び出されることです。doubleClickTimerダブルクリックで を nullに設定するのは奇妙ですが、delayedBtnClickそれは本当です:O

私はすでに長い時間、ブールフラグ、ロックを使用しようとしました...

あなたはなにか考えはありますか?

一番!

4

2 に答える 2

16

イベントの処理後に を に設定すると、RoutedEventの後に 2 回目にイベントが呼び出されることはありません。e.HandledtrueMouseDoubleClickClickMouseDoubleClick

のさまざまな動作に触れ、役立つ可能性がある最近の投稿があります。SingleClickDoubleClick

Clickただし、別の動作が必要であり、最初の と 2 番目の をブロックしたい/必要があることが確実な場合はClick、以前と同じように使用できますDispatcherTimer

private static DispatcherTimer myClickWaitTimer = 
    new DispatcherTimer(
        new TimeSpan(0, 0, 0, 1), 
        DispatcherPriority.Background, 
        mouseWaitTimer_Tick, 
        Dispatcher.CurrentDispatcher);

private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    // Stop the timer from ticking.
    myClickWaitTimer.Stop();

    Trace.WriteLine("Double Click");
    e.Handled = true;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    myClickWaitTimer.Start();
}

private static void mouseWaitTimer_Tick(object sender, EventArgs e)
{
    myClickWaitTimer.Stop();

    // Handle Single Click Actions
    Trace.WriteLine("Single Click");
}
于 2009-06-09T18:17:39.867 に答える
7

これを試すことができます:

Button.MouseLeftButtonDown += Button_MouseLeftButtonDown;

private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    e.Handled = true;

    if (e.ClickCount > 1)
    {
        // Do double-click code
    }

    else
    {
        // Do single-click code
    }
}

必要に応じて、マウスのクリックを要求し、マウスが上がるまで待機してアクションを実行できます。

于 2009-06-09T18:57:15.363 に答える