2012-01-01 2 views
3

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

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; 
} 

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

+0

Вы уверены, что пользовательский элемент управления имеет фокус клавиатуры, когда вы нажимаете клавишу? Я не понимаю, почему его нельзя уволить. Я также не понимаю, пытаетесь ли вы превратить событие в основную форму или нет. – Rotem

+0

Rotem, пользовательский элемент управления был формой окна, преобразованный в usercontrol.It работал отлично. Теперь я превратился в usercontrol и хочу запускать действия из формы родительского окна. У меня такая же проблема с другим проектом, когда я построил калькулятор и превратился в userControl. Теперь я помещаю его в форму окна, и кнопки не отвечают – Avrum

+0

Похоже, что решение должно быть общедоступным методом в usercontrol, который вызывает метод onKeyDown, хотя вы упомянули, что пытались это сделать, и это не сработало. В какой части это не сработало? – Rotem

ответ

1

Если я правильно понимаю, вы пытаетесь вызвать метод 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); 
} 
+0

Rotem, я попробовал ваше решение, не работал, но я отлаживал его и понял, что он работает для разных клавиш, кроме клавиш со стрелками. Я искал некоторые решения для этого, но не нашел ничего полезного. У вас есть идеи? – Avrum

+0

Я отредактировал свой ответ в соответствии с вашими комментариями. – Rotem

+0

Rotem, спасибо, ваше решение отлично работает (Toda) – Avrum

1

После обновленного вопроса и код примера размещено, если вы хотите, родитель форма должна быть уведомлены о том, что операция перемещения имело место, необходимо создать событие в 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 
    } 
} 
+0

Это WindowsForms – Avrum

+0

Спасибо, я отредактирую комментарий. Итак, вы хотите получать уведомление о OnKeyDown пользовательского контроля в родительской форме? Вы пытались просто подключиться к мероприятию? Например. UserControl.KeyDown + = new EventHandler (myForm.KeyDownOfUserControl) –

+0

Проблема в том, что переопределение OnKeyDown защищено, у меня нет доступа к нему. Я попытался добавить еще один метод в child (public), а затем повторно передать EventArgs в переопределенное событие, но это не сработало. Любые идеи? Спасибо – Avrum

Смежные вопросы