Ralf Meier Ответов: 2

Разница в поведении между button. click и label.click


Я обнаружил разницу в поведении между событием Click-Event от обоих этих элементов управления.
Событие Click (или OnClick-метод) из элемента управления Button вызывается примерно в 2 раза быстрее, чем то же событие (метод) из элемента управления Label (или Control).

Может ли кто - нибудь объяснить мне, почему-или лучше, что нужно сделать, чтобы оба элемента управления реагировали одинаково ?



Хорошо ... кто-то не стеснялся голосовать за мой вопрос (возможно, это просто, чтобы его задали) ... но никто не в состоянии дать ответ ... отлично...

Что я уже пробовал:

в данный момент понятия не имею ... :( ..

OriginalGriff

Как вы это проверяете?
Какие цифры вы получаете?

Ralf Meier

Я узнал об этом случайно.
У меня есть самостоятельно созданная кнопка управления, которая происходит от (Windows.Формы.)Контроль (я также проверил то же самое с выводом из Label или ButtonBase).
В своем приложении я работаю с событиями. Теперь у меня есть цель, которая может иметь быстрые нажатия кнопок. Здесь моя кнопка позволяет только несколько кликов. Если я изменю наследование (от моего элемента управления) на кнопку, я смогу работать с ней так, как захочу.
Так... отсюда и мой вопрос. Ничего (в коде) не изменилось, кроме наследования, но производительность сильно изменилась ...

Karthik_Mahalingam

Опубликуйте свой код

Ralf Meier

см. мой ответ на комментарий от OG ...

Karthik_Mahalingam

ладно

Ralf Meier

Я думаю, вы поняли мой вопрос совершенно неправильно. См. мой ответ на комментарий от OG ...

[no name]

Сравнивали ли вы время между событием Click и Переопределяемым методом OnClick в производном классе

Ralf Meier

Нет , я не сравниваю время. Я только сравнил реальную реакцию с моим "тест-приложением". Так... "В 2 раза быстрее" может быть предположением - на самом деле это также может быть в 1,5 раза быстрее или в 3 раза быстрее, - но есть разница, которую я не могу понять, потому что все эти элементы управления изначально происходят от контроля ...

Maciej Los

Кнопка-контроль поднимается примерно в 2 раза быстрее, чем то же событие (метод) из метки-контроля (или контроля). - Я считаю, что это утверждение не соответствует действительности!

Ralf Meier

Хорошо ... затем создайте форму, поместите на нее кнопку, метку и текстовое поле.
Теперь вы создаете метод, который переключает текст из текстового поля.
Подключите этот метод к кнопке.Click-Event также относится к метке.событие click.
Теперь переключите это на run и быстро нажмите на кнопку и посмотрите, как переключается содержимое текстового поля, а затем сделайте то же самое с меткой ...
В моем тестовом приложении (только для этого) Я мог бы нажать кнопку в 2 раза быстрее (чтобы получить реальный результат), чем метку ... Мое тестовое приложение делает только это-и ничего больше ... а также со стандартными-Windows-элементами управления ...

Maciej Los

Никакая разница... время исполнения-то же самое.

Ralf Meier

Не для меня ...
Я использую .Net-Framework 4.0
Но если я тебе поверю, Мацей, - какая разница ?..

0x01AA

Я могу подтвердить ваши наблюдения. Я просто погружаюсь в эталонную реализацию c# :)

[Редактировать]
Забавно: попробуйте нажать левую / правую кнопку мыши на этикетке. Как и эта метка, возьмите примерно ту же скорость клика, что и кнопка.


Кстати: см. комментарий в справочной реализации:
// Если бы не FormatControl, мы могли бы наследовать от ButtonBase и получать изображения переднего плана бесплатно.
метка публичного класса: контроль {

Ralf Meier

см. мой ответ на комментарий Алана Н ...

Но... спасибо, что подтвердили мою проблему. Я уже начал сомневаться в себе ... :(

Ralf Meier

Я проверил его еще раз. Теперь с щелчком мыши вместо щелчка.
Тот же результат-кнопка принимает гораздо больше кликов (и вынужденных реакций) за одно и то же время, чем метка ...
Но между прочим: я не говорил о времени казни. Я говорил о реальных Щелчковых реакциях ...

Maciej Los

Время щелчка-реакции все то же...

Ralf Meier

см. мой ответ на комментарий Алана Н ...
Так что я не понимаю, почему вы получили другие результаты, чем я ... !?

Alan N

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

Ralf Meier

ОК... возможно, причина в этом. Чтобы обнаружить двойной щелчок, необходимо подождать некоторое время, чтобы увидеть, не появится ли еще один щелчок. Только по истечении этого времени событие могло быть поднято.
Также это соответствует моим собственным экспериментам :
Я создаю флаг, который устанавливается с помощью MouseDown и очищается с помощью MouseUp. Wenn MouseDown приходит, и флаг не установлен, я поднимаю событие. Теперь событие происходит так же быстро,как и при нажатии кнопки.
Приятный опыт ...

2 Ответов

Рейтинг:
17

Ralf Meier

Ссылаясь на комментарии 0x01AA и Alan N и мои собственные исследования, я обнаружил, что это "обходной путь" для создания собственной настраиваемой кнопки, которая наследует Control или ButtonBase или Label :

Private fm_Click As Boolean = False

Protected Overrides Sub OnMouseDown(e As System.Windows.Forms.MouseEventArgs)
   If Not fm_Click Then
        RaiseEvent MouseClick(Me, e)
        fm_Click = True
    End If
     MyBase.OnMouseDown(e)
End Sub

Protected Overrides Sub OnMouseUp(e As System.Windows.Forms.MouseEventArgs)
    fm_Click = False
    MyBase.OnMouseUp(e)
End Sub

Public Shadows Event MouseClick(ByVal sender As Object, e As System.Windows.Forms.MouseEventArgs)


Как написал Алан Н в своем комментарии, я полагаю, что обнаруженная "задержка" происходит от времени обнаружения, которое необходимо для определения того, может ли входящий щелчок также быть двойным щелчком.

Спасибо всем за комментарии, которые привели меня к цели ...


Maciej Los

5!

Ralf Meier

Спасибо, Мацей.
Но взгляните также на решение от 0x01AA ...

Рейтинг:
11

0x01AA

Проконсультировавшись со справочным источником c# и сравнив кнопки и элементы управления-особенно ctors - я обнаружил, что это делает свою работу:

public class MyLabel : Label
{
    public MyLabel()
    {
        SetStyle(ControlStyles.StandardDoubleClick, false);
    }
}

Надеюсь, это поможет.


Ralf Meier

Очень хорошо и большое вам спасибо. Это решение намного лучше (а также намного проще), чем мое собственное.
+5 !!!!

0x01AA

Добро пожаловать. Спасибо за Ваш голос.

Maciej Los

5ед!

0x01AA

Большое вам спасибо, Мацей.