سؤال

لا بد لي من التعامل مع كل من النقر واحد والنقر المزدوج للزر في تطبيق WPF مع تفاعل مختلف. لسوء الحظ، على DoubleClick، ينطلق 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
}

المشكلة هي أن "إجراء النقر واحد" يسمى بعد "إجراء النقر المزدوج" على DoubleClick. من الغريب أنني وضعتdoubleClickTimer إلى null على النقر المزدوج ولكن في delayedBtnClick صحيح: س

لقد حاولت بالفعل استخدام وقت أطول، علم BOOL وقفل ...

هل لديك أي أفكار؟

أفضل!

هل كانت مفيدة؟

المحلول

إذا قمت بتعيين RoutedEvente.Handled ل true بعد التعامل مع MouseDoubleClick الحدث ثم لن يسمي Click الحدث في المرة الثانية بعد MouseDoubleClick.

هناك المنشور الاخير الذي يلمس وجود سلوكيات مختلفة ل 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
    }
}

إذا كانت neccessary، فيمكنك أن تتطلب نقرة الماوس والانتظار حتى تصل الماوس لأداء الإجراء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top