WPF:ボタンシングルクリック+ダブルクリックの問題
-
13-09-2019 - |
質問
私はシングルクリックと異なる反応で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
するtrue
のMouseDoubleClick
を設定した場合は、それはClick
後MouseDoubleClick
イベントをもう一度呼び出すことはありません。
に触れる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
}
}
必要であれば、あなたはマウスクリックを必要とし、アクションを実行するために、マウスアップまで待ってます。