Нет доступа к функции двойного щелчка в C# wpf - PullRequest
0 голосов
/ 13 июля 2020

Добрый день, подскажите пожалуйста, у меня есть программа и там нужно в 1 клик создать объект, а с помощью двойного клина удалить его. Так что у меня в c# wpf двойной щелчок не работает. Код ниже:

XAML:

  private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var canvas = (Canvas)sender;
        if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 2)
        {
            if (e.OriginalSource is ICalcefication)
            {
                UIElement activeCalcification = (UIElement)e.OriginalSource;
                _maker.DeleteMarker(canvas, activeCalcification);
            }
        }
        else if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 1)
        {
            Point location = e.MouseDevice.GetPosition(canvas);
            _maker.AddMarker(canvas, location, _calcificationType);

        }
    }

*. Cs:

  private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var canvas = (Canvas)sender;
        if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 2)
        {
            if (e.OriginalSource is ICalcefication)
            {
                UIElement activeCalcification = (UIElement)e.OriginalSource;
                _maker.DeleteMarker(canvas, activeCalcification);
            }
        }
        else if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 1)
        {
            Point location = e.MouseDevice.GetPosition(canvas);
            _maker.AddMarker(canvas, location, _calcificationType);

        }
    }

1 Ответ

0 голосов
/ 13 июля 2020

Каждый двойной щелчок начинается с одного щелчка. Вам следует подождать.

CancellationTokenSource cts;

private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var canvas = (Canvas)sender;
    if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 2)
    {
        cts.Cancel(); // It is double click; wait is over, cancel single click
        if (e.OriginalSource is ICalcefication)
        {
            UIElement activeCalcification = (UIElement)e.OriginalSource;
            _maker.DeleteMarker(canvas, activeCalcification);
        }
    }
    else if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 1)
    {
        cts = new CancellationTokenSource();
        Task.Run(async () =>
        {
            await Task.Delay(300);
            if (cts.IsCancellationRequested)
            {
                return;
            }

            this.Dispatcher.Invoke(() =>
            {
                Point location = e.MouseDevice.GetPosition(canvas);
                _maker.AddMarker(canvas, location, _calcificationType);
            });

        });
    }
}
...