23nigam Ответов: 3

Как отличить нажатие кнопки от длительного нажатия кнопки в c# на .Net Framework 3.5


Я создаю приложение на C# в visual Studio 2008, где в одной кнопке будет 2 использования, и это будет зависеть от того, просто ли пользователь нажимает кнопку или долго нажимает кнопку.

я думал добавить таймер, но это очень неуклюжий способ, и я думал, есть ли встроенный способ для этого

Sergey Alexandrovich Kryukov

Я ответил, но в случае необходимости более подробной информации вам нужно пометить используемую вами библиотеку пользовательского интерфейса.
--СА

3 Ответов

Рейтинг:
22

Sergey Alexandrovich Kryukov

Легко. За исключением нажатия кнопки, есть события более низкого уровня, кнопка вниз, а затем кнопка вверх. Вы можете определить время между этими событиями. Дальнейшая детализация зависит от библиотеки пользовательского интерфейса, которую вы хотите использовать, и типа приложения, но код будет очень похож.

[РЕДАКТИРОВАТЬ]

В большинстве приложений я бы не рекомендовал вам работать с синхронизацией между событиями вниз и вверх, так как пользователи к этому не привыкли, это не распространенный стиль пользовательского интерфейса. Но иногда мы хотим выйти из общих стилей пользовательского интерфейса, тогда ваша идея может сработать для вас. Но даже в этом случае не думайте, что пользователь получит его, если вы не заботитесь о том, чтобы как-то объяснить эту необычную функцию.

—СА


Рейтинг:
1

giaosucan

Вы можете добавить событие mouseLeftButtonDown к этой кнопке. И обнаружьте событие long click с помощью этого метода

/// <summary>
/// Detect Mouse Long Click
/// </summary>
/// <param name="element">Framework</param>
/// <param name="duration">Set duration of long click</param>
/// <returns>true: Long Click false: Not Long Click</returns>
public static Task<bool> MouseDown(this FrameworkElement element, TimeSpan duration)
{
    DispatcherTimer timer = new DispatcherTimer();
    TaskCompletionSource<bool> task = new TaskCompletionSource<bool>();
    timer.Interval = duration;

    MouseButtonEventHandler touchUpHandler = delegate
    {
        timer.Stop();
        if (task.Task.Status == TaskStatus.Running)
        {
            task.SetResult(false);
        }
    };

    element.PreviewMouseUp += touchUpHandler;

    timer.Tick += delegate
    {
        element.PreviewMouseUp -= touchUpHandler;
        timer.Stop();
        task.SetResult(true);
    };

    timer.Start();
    return task.Task;
}


Вызовите метод в вашем событии btn_MouseLeftButtonDown
Например

private async void btn_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {

        boolean isLongPress = await MouseDown(e.Source as Button,           TimeSpan.FromSeconds(0.4));
       if (isLongPress) {
          // long press
       } else {
        //short press
       }
    }


Рейтинг:
1

Ersin Kecis

мое самое короткое решение этой проблемы:

private bool mouseUp = false;
private const int holdButtonDuration = 2000; //milliseconds
private void btnTest_MouseDown(object sender, MouseEventArgs e)
{
    mouseUp = false;
    Stopwatch sw = new Stopwatch();
    sw.Start();
    while (e.Button == MouseButtons.Left && e.Clicks == 1 && (mouseUp == false && sw.ElapsedMilliseconds < holdButtonDuration))
        Application.DoEvents();
    if (sw.ElapsedMilliseconds < holdButtonDuration)
        btnTest_ShortClick(sender, e);
    else
        btnTest_LongClick(sender, e);
}
private void btnTest_MouseUp(object sender, MouseEventArgs e)
{
    mouseUp = true;
}