Как установить событие клика для формы? - PullRequest
6 голосов
/ 08 октября 2008

У меня есть форма c # (назовем ее MainForm) с множеством пользовательских элементов управления. Мне бы хотелось, чтобы метод MainForm.OnClick () запускался каждый раз, когда кто-то нажимает на форму независимо от того, произошел ли щелчок в форме или щелчок был одним из пользовательских элементов управления. Я ищу поведение, похожее на функцию KeyPreview форм, за исключением щелчков мышью, а не нажатия клавиш.

Ответы [ 6 ]

6 голосов
/ 16 августа 2012

Я рекомендую создать базовую форму для наследования других форм в вашем приложении. Добавьте этот код в базовую форму, чтобы создать новое событие с именем GlobalMouseClickEventHandler:

namespace Temp
{
    public delegate void GlobalMouseClickEventHander(object sender, MouseEventArgs e);

    public partial class TestForm : Form
    {
        [Category("Action")]
        [Description("Fires when any control on the form is clicked.")]
        public event GlobalMouseClickEventHander GlobalMouseClick;

        public TestForm()
        {
            InitializeComponent();
            BindControlMouseClicks(this);
        }

        private void BindControlMouseClicks(Control con)
        {
            con.MouseClick += delegate(object sender, MouseEventArgs e)
            {
                TriggerMouseClicked(sender, e);
            };
            // bind to controls already added
            foreach (Control i in con.Controls)
            {
                BindControlMouseClicks(i);
            }
            // bind to controls added in the future
            con.ControlAdded += delegate(object sender, ControlEventArgs e)
            {
                BindControlMouseClicks(e.Control);
            };            
        }

        private void TriggerMouseClicked(object sender, MouseEventArgs e)
        {
            if (GlobalMouseClick != null)
            {
                GlobalMouseClick(sender, e);
            }
        }
    }
}

Это решение будет работать не только для элементов управления верхнего уровня, но и для вложенных элементов управления, таких как элементы управления, размещенные внутри панелей.

3 голосов
/ 08 октября 2008

В событии ControlAdded формы добавьте обработчик MouseClick к элементу управления с адресом события нажатия формы. Я не проверял это, но это может сработать.

Private Sub Example_ControlAdded(ByVal sender As Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles Me.ControlAdded

    AddHandler e.Control.MouseClick, AddressOf Example_MouseClick
End Sub

Private Sub Example_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick
    MessageBox.Show("Click")
End Sub
1 голос
/ 08 октября 2008

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

    public Form1()
    {
        InitializeComponent();
        HookEvents();
    }

    private void HookEvents() {
        foreach (Control ctl in this.Controls) {
            ctl.MouseClick += new MouseEventHandler(Form1_MouseClick);
        }
    }  

    void Form1_MouseClick(object sender, MouseEventArgs e)
    {
        LogEvent(sender, "MouseClick");
    }

    // and then this just logs to a multiline textbox you have somwhere on the form
    private void LogEvent(object sender, string msg) {
        this.textBox1.Text = string.Format("{0} {1} ({2}) \n {3}",
            DateTime.Now.TimeOfDay.ToString(),
            msg,
            sender.GetType().Name,
            textBox1.Text
            );
    }

Вывод выглядит примерно так, показывая все события и кто их "отправил":

14:51:42.3381985 MouseClick (Form1) 
14:51:40.6194485 MouseClick (RichTextBox) 
14:51:40.0100735 MouseClick (TextBox) 
14:51:39.6194485 MouseClick (Form1) 
14:51:39.2131985 MouseClick (RichTextBox) 
14:51:38.8694485 MouseClick (Button) 

НТН.

1 голос
/ 08 октября 2008

Единственный способ, которым мне когда-либо удавалось это сделать, - обрабатывать событие [c] Click [/ c] каждого элемента управления. Я не верю, что событие возникает до того, как контроль его обработает.

В WPF есть «туннельные» события предварительного просмотра, которые предоставляют эту функциональность, но это не очень помогает вам в WinForms.

0 голосов
/ 08 октября 2008

Это распространенный шаблон в разработке, который называется шаблоном Observer. Есть много примеров шаблонов Observer, и c # здесь 1 пример http://msdn.microsoft.com/en-us/library/ms954621.aspx, но с хорошим гуглом.

0 голосов
/ 08 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...