如何通过键盘滚动面板



在表单中,我有一个 Panel,其中包含一个PictureBox,而没有其他内容。一个要求之一是,用户应该仅使用键盘就可以滚动浏览该面板的内容。换句话说,他们首先需要在面板中标记,然后使用上/下/down/pageup/pageown键进行滚动。

根据Microsoft文档,

TabStop属性对面板控件没有影响,因为它是一个 容器对象。

,在尝试之后,它似乎是非常真实的。在查找图片框的塔巴斯普属性时,它只是说

此属性与此类无关。

我尝试在面板中添加VScrollBar并将其TabStop设置为True,但这似乎没有做任何事情。

实现所需效果的最佳方法是什么?

您可以从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);
        }
    }
}

最新更新