使PictureBox不会失去对箭头键的关注?

1 winforms

这个问题,除了我想问我如何使我的图片框不会失去对箭头键按键的关注.当我重载它并设置TabStop = true时它会得到焦点,但箭头键给我带来了问题.

Han*_*ant 6

这需要重写控件的IsInputKey()方法.需要进行相当多的额外手术才能让图片框首先获得焦点.首先在项目中添加一个新类,使其看起来类似于:

using System;
using System.Drawing;
using System.ComponentModel;
using System.Windows.Forms;

class MyPictureBox : PictureBox {
    public MyPictureBox() {
        SetStyle(ControlStyles.Selectable, true);
        SetStyle(ControlStyles.UserMouse, true);
        this.TabStop = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以确保控件可以获得焦点并可以选项卡.接下来,您必须撤消TabStop和TabIndex属性的属性,以便用户可以设置Tab键顺序:

[Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
public new int TabIndex {  
    get { return base.TabIndex; }
    set { base.TabIndex = value; }
}

[Browsable(true), EditorBrowsable(EditorBrowsableState.Always)]
public new bool TabStop {
    get { return base.TabStop; }
    set { base.TabStop = value; }
}
Run Code Online (Sandbox Code Playgroud)

接下来,您必须向用户说明控件具有焦点,以便她知道操作光标键时会发生什么:

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) {
        Rectangle rc = this.DisplayRectangle;
        rc.Inflate(-2, -2);
        ControlPaint.DrawFocusRectangle(pe.Graphics, rc);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,您重写IsInputKey(),以便控件可以看到箭头键:

protected override bool IsInputKey(Keys keyData) {
    if (keyData == Keys.Up || keyData == Keys.Down ||
        keyData == Keys.Left || keyData == Keys.Right) return true;
    return base.IsInputKey(keyData);
}
Run Code Online (Sandbox Code Playgroud)

编译.将新控件从工具箱顶部拖放到表单上.