Вызов события на элемент управления пользователя от родителя - PullRequest
3 голосов
/ 01 января 2012

У меня есть пользовательский элемент управления со следующим переопределенным событием:

protected override void OnKeyDown(KeyEventArgs e)
{
    if (e.KeyCode == Keys.Left )
        DoSomething();
}

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

protected override void OnKeyDown(KeyEventArgs e)
{
    e.Handled = true;
    if (e.KeyCode == Keys.Left)
        Move(pt.X,pt.Y);//Move is a function within the usercontrol
    else if (e.KeyCode == Keys.Right)
        Move(pt.X,pt.Y);
   //other conditions
   e.Handled = false;
}

Мне нужно, чтобы родитель был уведомлен об этом событии

Ответы [ 2 ]

1 голос
/ 01 января 2012

Если я правильно понимаю, вы пытаетесь вызвать метод OnKeyDown пользовательского элемента управления из родительской формы.
Это основной класс формы:

public class Form1 : Form
{
    private UserControl1 myControl;

    public Form1()
    {
        myControl = new UserControl1();
        Controls.Add(myControl);
    }

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        myControl.InvokeOnKeyDown(e);
    }
}

А это пользовательский элемент управления:

public class UserControl1 : UserControl
{
    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        MessageBox.Show("Key Down Fired!");
    }

    public void InvokeOnKeyDown(KeyEventArgs e)
    {
        OnKeyDown(e);
    }
}

Редактирование относительно клавиш со стрелками: клавиши со стрелками обычно не считаются клавишами ввода и поэтому не передаются методам клавиш. Чтобы изменить это, вы должны переопределить метод IsInputKey следующим образом:

 protected override bool IsInputKey(Keys e)
 {
     if (e == Keys.Up || e == Keys.Down ||
         e == Keys.Left || e == Keys.Right) return true;
     return base.IsInputKey(e);
 }
1 голос
/ 01 января 2012

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

С уважением

// Define custom EventArgs to pass into the Move event
public class MoveEventArgs : EventArgs
{
    private Point _movePoint;
    public MoveEventArgs(Point movePoint)
    {
        _movePoint = _movePoint;
    }

    public Point MovePoint { get { return _movePoint; } } 
}

// Define a custom user control that raises an event to subscribers on move
public class MyUserControl : UserControl
{
    public event EventHandler<MoveEventArgs> Moved;

    protected override void OnKeyDown(KeyEventArgs e)
    {
        e.Handled = true;
        if (e.KeyCode == Keys.Left)
        {
            Move(pt.X,pt.Y);//Move is a function within the usercontrol
            OnMoved(pt);
        }   
        else if (e.KeyCode == Keys.Right)
        {
            Move(pt.X,pt.Y);
            OnMoved(pt);
        }
       //other conditions
       e.Handled = false;
    }

    // Raises a custom event, Moved 
    protected void OnMoved(Point movePoint)
    {
        var handler = Moved;
        if (handler != null)
        {
            handler(this, new MoveEventArgs(movePoint);
        }
    }
}

// How to subscribe to the event (and be notified of move)
public class MyParentForm : Form
{
    public MyParentForm()
    {
        InitializeComponent();
        _myUserControl.Moved += new EventHandler<MoveEventArgs>(MyUserControl_Moved);
    }

    private void MyUserControl_Moved(object sender, MoveEventArgs e)
    {
        // e.MovePoint now contains the point that the usercontrol was moved to
        // this event will fire whenever the user presses Left or Right arrow
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...