質問

私はシングルクリックと異なる反応でWPFアプリケーションでボタンのダブルクリックの両方を処理しなければなりません。 残念ながら、ダブルクリックの上、WPFは、二つのクリックイベント、ダブルクリックイベントを発生させますので、この状況に対処するのは難しいです。

これは、私はあなたが私を助けることを願って...タイマーを使用してそれを解決しようとしたが、成功せず。

は、コードを見てみましょう。

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
}

問題は、ダブルクリックの「ダブルクリックACTION」の後いわゆる「シングルクリックACTION」。それは私が、ダブルクリックでnullにthedoubleClickTimerを設定することを奇妙だけどdelayedBtnClickにそれは本当だ:O

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

あなたが任意のアイデアを持っていますか?

ベスト!

役に立ちましたか?

解決

あなたはRoutedEventイベントを処理した後e.HandledするtrueMouseDoubleClickを設定した場合は、

それはClickMouseDoubleClickイベントをもう一度呼び出すことはありません。

に触れるhref="https://stackoverflow.com/questions/970898/double-click-vs-single-click-are-these-mutually-exclusive">最近のポストのSingleClickとDoubleClickに対して異なる挙動を有する。

あなたが別の行動をしたいとよろしいであれば、

ただし、/あなたがいたようにあなたがClickを使用することができ、二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");
}

他のヒント

あなたはこれを試すことができます:

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
    }
}

必要であれば、あなたはマウスクリックを必要とし、アクションを実行するために、マウスアップまで待ってます。

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