Формы C #: вызвать событие мыши (передать из дочернего элемента в родительский) - PullRequest
0 голосов
/ 02 июля 2018

Ищу любое решение. У меня есть пользовательский элемент управления с несколькими текстовыми полями. При размещении в форме события MouseDown и MouseMove запускаются только при щелчке мышью по телу пользовательского элемента управления, но не при нажатии в текстовом поле. Можно ли вызвать событие mousedown пользовательского элемента управления, когда происходит событие mousedown текстового поля? Или возможно передать события от объекта его родителю? (и все еще сможете щелкнуть текстовое поле, чтобы редактировать его?)

Спасибо

1 Ответ

0 голосов
/ 02 июля 2018

В этом примере я обработал событие TextBoxes MouseDown. Отсюда вы можете вызвать событие MouseDown UserControl, которое содержит ваш TextBox.

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
        OnMouseDown(e); // Goes through as a MouseDown Event from UserControl1
    }
}

В зависимости от ваших требований, это может не сработать для вас, так как при обработке MouseDown UserControl он будет создан как UserControl (параметр отправителя будет ссылаться на UserControl1.

Я также извлек реализацию OnMouseDown класса Control, чтобы посмотреть, можно ли его использовать:

        // Extracted using Reflection
        // This will not compile as Control.EventMouseDown is a private member
        System.Windows.Forms.MouseEventHandler mouseEventHandler = (System.Windows.Forms.MouseEventHandler)this.Events[System.Windows.Forms.Control.EventMouseDown];
        if (mouseEventHandler == null)
            return;
        mouseEventHandler(sender, e);

К сожалению, события хранятся в закрытом доступе и недоступны.

Если вы хотите узнать и обработать событие MouseDown по-другому, если оно происходит из TextBox, вам придется объявить и вызвать пользовательское событие.

Объявление пользовательского события

public event EventHandler<MouseEventArgs> TextBoxMouseDownEvent;

Поднять пользовательское событие из TextBox_MouseDown

private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
    EventHandler<MouseEventArgs> handler = TextBoxMouseDownEvent;
    if (handler != null)
    {
        handler(sender, e);
    }
}
...