如何通过键盘滚动面板?

时间:2019-03-11 14:05:55

标签: c# vb.net winforms scroll panel

在表单中,我有一个Panel,其中包含一个PictureBox,没有其他内容。要求之一是用户应该仅使用键盘就可以滚动浏览面板的内容。换句话说,他们首先需要进入面板,然后使用Up / Down或PageUp / PageDown键进行滚动。

根据Microsoft文档,

  

TabStop属性对Panel控件无效,因为它是一个   容器对象。

在尝试之后,这似乎是真的。当查找PictureBox的TabStop属性时,它类似于

  

此属性与此类无关。

我尝试将VScrollBar添加到面板并将其TabStop设置为True,但这似乎无济于事。

达到预期效果的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以从Panel派生并将其设置为Selectable并将其TabStop设置为true。然后,只需覆盖ProcessCmdKey并处理箭头键即可滚动。不要忘记也将其AutoScroll设置为true。

可选面板-可通过键盘滚动

using System.Drawing;
using System.Windows.Forms;
class SelectablePanel : Panel
{
    const int ScrollSmallChange = 10;
    public SelectablePanel()
    {
        SetStyle(ControlStyles.Selectable, true);
        SetStyle(ControlStyles.UserMouse, true);
        TabStop = true;
    }
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (!Focused)
            return base.ProcessCmdKey(ref msg, keyData);

        var p = AutoScrollPosition;
        switch (keyData)
        {
            case Keys.Left:
                AutoScrollPosition = new Point(-ScrollSmallChange - p.X, -p.Y);
                return true;
            case Keys.Right:
                AutoScrollPosition = new Point(ScrollSmallChange - p.X, -p.Y);
                return true;
            case Keys.Up:
                AutoScrollPosition = new Point(-p.X, -ScrollSmallChange - p.Y);
                return true;
            case Keys.Down:
                AutoScrollPosition = new Point(-p.X, ScrollSmallChange - p.Y);
                return true;
            default:
                return base.ProcessCmdKey(ref msg, keyData);
        }
    }
}