Событие щелчка для элемента управления .Net (Windows Forms) - PullRequest
5 голосов
/ 28 апреля 2011

Вероятно, это очень простой вопрос, но по какой-то причине даже правильный способ поиска ответа в Интернете ускользает от меня ...

Я пытаюсь создать пользовательский элемент управления, состоящий из нескольких меток и индикаторов выполнения. Однако я хочу, чтобы у всего элемента управления было событие «Click», которое вызывается независимо от того, на каком элементе внутри элемента управления нажата кнопка. Я создал процедуру «HandleClick», которая назначается каждому элементу управления:

    private void HandleClick(object sender, EventArgs e)
    {
        // Call the callback function, if we were asked to
        if (OnClick != null)
        {
            EventArgs ee = new EventArgs();
            OnClick(this, ee);
        }
        else
        {
            MessageBox.Show("OnClick was null!");
        }
    }

В данном случае OnClick - это переменная, определенная на уровне управления:

    public new event EventHandler OnClick;

Теперь это правильно работает только в форме. На одной метке он показывает MessageBox, а затем вызывает событие во вложенной форме. Все остальные показывают окно сообщения.

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

Ответы [ 2 ]

10 голосов
/ 05 мая 2011

Извините за это - просто поставьте ответ на случай, если кто-то его погуглит ...

В случае, если вам интересно, эта статья помогла решить эту проблему: Пользовательский щелчок мышью - Windows Forms … По сути, удалите HandleClick и свойство и замените этот вместо:

public new event EventHandler Click
{
    add
    {
        base.Click += value;
        foreach (Control control in Controls)
        {
            control.Click += value;
        }
    }
    remove
    {
        base.Click -= value;
        foreach (Control control in Controls)
        { 
            control.Click -= value;
        }
    }
}
0 голосов
/ 28 апреля 2011

Я никогда не пробовал это с Windows Forms, но в других графических интерфейсах я поместил прозрачную панель, которая покрывает всю форму, чтобы при нажатии «в форме» событие фактически переходило к элементу управления панели.1001 *

...