2015-12-13 5 views
0

У меня есть UserControl, который имеет некоторые другие элементы управления, а затем Panel, которые я использую для рисования пользовательских фигур на событиях мыши. Я хотел бы добавить некоторые другие функции, но для этого мне нужно было бы обнаружить KeyDown и KeyUp, пока мышь рисует фигуры на панели (в этой ситуации UserControl.KeyDown/KeyUp никогда не срабатывает). Как это можно достичь?События KeyDown и KeyUp в пользовательском UserControl

EDIT

Вот минимальная версия для UserControl, где эта проблема может быть видно:

public partial class UserControl1 : UserControl 
{ 
    TextBox textBox1; 
    Panel panel1; 
    public UserControl1() 
    { 
     InitializeComponent(); 

     textBox1 = new System.Windows.Forms.TextBox(); 
     textBox1.Location = new System.Drawing.Point(0, 0); 
     this.Controls.Add(this.textBox1); 

     panel1 = new System.Windows.Forms.Panel(); 
     panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
     panel1.Location = new System.Drawing.Point(0, 25); 
     panel1.Size = new System.Drawing.Size(300, 150); 
     panel1.MouseEnter += new System.EventHandler(this.panel1_MouseEnter); 
     this.Controls.Add(this.panel1); 

     this.Size = new System.Drawing.Size(300, 200); 
     this.KeyDown += UserControl1_KeyDown; 
    } 

    private void panel1_MouseEnter(object sender, EventArgs e) 
    { 
     panel1.Focus(); 
    } 

    void UserControl1_KeyDown(object sender, KeyEventArgs e) 
    { 
     MessageBox.Show("Key down"); 
    } 

} 

Когда этот элемент находится внутри формы никогда не отображается сообщение «Ключ вниз».

+0

Нам нужно будет увидеть ваш код, иначе мы понятия не имеем, в чем проблема. Проверьте [ask] некоторые хорошие рекомендации. –

+0

Вы можете найти ответы на [этот вопрос] (http://stackoverflow.com/q/1152784/622391). –

+1

События клавиатуры активируются с помощью элемента управления, имеющего фокус. Это никогда не будет UserControl. Вы ошибаетесь, потому что вы не можете * видеть * фокус, это сильная проблема юзабилити пользовательского интерфейса. Проверьте [этот пост] (http://stackoverflow.com/a/3562449/17034). –

ответ

0

Я взял код из Hans Passant here (большой намек, большое спасибо!), И я изменил его, чтобы удовлетворить свои потребности следующим образом:

class SelectablePanel : Panel 
{ 
    public SelectablePanel() 
    { 
     this.SetStyle(ControlStyles.Selectable, true); 
     this.TabStop = true; 
    } 
    protected override bool IsInputKey(Keys keyData) 
    { 
     if (keyData == Keys.Up || keyData == Keys.Down) return true; 
     if (keyData == Keys.Left || keyData == Keys.Right) return true; 
     return base.IsInputKey(keyData); 
    } 
    protected override void OnKeyDown(KeyEventArgs e) 
    { 
     var handler = KeyDown; 
     if (handler != null) handler(this, e); 
    } 
    protected override void OnKeyPress(KeyPressEventArgs e) 
    { 
     var handler = KeyPress; 
     if (handler != null) handler(this, e); 
    } 
    protected override void OnKeyUp(KeyEventArgs e) 
    { 
     var handler = KeyUp; 
     if (handler != null) handler(this, e); 
    } 
    protected override void OnMouseEnter(EventArgs e) 
    { 
     this.Focus(); 
     base.OnMouseEnter(e); 
    } 
    protected override void OnEnter(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnEnter(e); 
    } 
    protected override void OnLeave(EventArgs e) 
    { 
     this.Invalidate(); 
     base.OnLeave(e); 
    } 
    protected override void OnPaint(PaintEventArgs pe) 
    { 
     base.OnPaint(pe); 
     if (this.Focused) 
     { 
      var rc = this.ClientRectangle; 
      rc.Inflate(-2, -2); 
      ControlPaint.DrawFocusRectangle(pe.Graphics, rc); 
     } 
    } 

    [Browsable(true)] 
    public new event EventHandler<KeyEventArgs> KeyDown; 
    [Browsable(true)] 
    public new event EventHandler<KeyEventArgs> KeyUp; 
    [Browsable(true)] 
    public new event EventHandler<KeyPressEventArgs> KeyPress; 
} 

Наконец я изменил свой исходный код, как это:

public partial class UserControl1 : UserControl 
{ 
    TextBox textBox1; 
    SelectablePanel selectablePanel; 
    public UserControl1() 
    { 
     InitializeComponent(); 

     textBox1 = new System.Windows.Forms.TextBox(); 
     textBox1.Location = new System.Drawing.Point(0, 0); 
     this.Controls.Add(this.textBox1); 

     selectablePanel = new SelectablePanel(); 
     selectablePanel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 
     selectablePanel.Location = new System.Drawing.Point(0, 25); 
     selectablePanel.Size = new System.Drawing.Size(300, 150); 
     selectablePanel.KeyDown += panel1_KeyDown; 
     this.Controls.Add(this.selectablePanel); 

     this.Size = new System.Drawing.Size(300, 200); 
    } 

    void panel1_KeyDown(object sender, KeyEventArgs e) 
    { 
     MessageBox.Show("Key down"); 
    } 
} 

и теперь он работает для того, что мне нужно.

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