문제

다른 반응을 가진 WPF 응용 프로그램에서 단일 클릭과 버튼의 두 번 클릭을 모두 처리해야합니다. 불행히도, DoubleClick에서 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
}

문제는 DoubleClick에서 'Double Click Action'이후에 호출 된 '단일 클릭 액션'이라는 것입니다. 내가 설정 한 것은 이상하다doubleClickTimer 두 번 클릭하지만 delayedBtnClick 사실입니다 : o

나는 이미 더 긴 시간, 부울 깃발과 잠금을 사용하려고 노력했습니다 ...

아이디어가 있습니까?

최고!

도움이 되었습니까?

해결책

당신이 설정하면 RoutedEvent'에스 e.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