Как прокрутить панель с клавиатуры? - PullRequest
1 голос
/ 11 марта 2019

Внутри формы у меня есть Panel, который содержит один PictureBox и ничего больше.Одним из требований является то, что пользователь должен иметь возможность прокручивать содержимое этой панели, используя только клавиатуру.Другими словами, им сначала нужно будет перейти на панель, а затем использовать клавиши «Вверх», «Вниз» или «PageUp / PageDown» для прокрутки.

Согласно документам Microsoft,

Свойство TabStop не влияет на элемент управления Panel, поскольку он является контейнерным объектом.

Что после его проверки выглядит очень верным.Это похоже на поиск свойства TabStop для PictureBox, где оно просто говорит

Это свойство не относится к этому классу.

Я попытался добавить VScrollBarна панель и установите TabStop на True, но это, похоже, ничего не дает.

Каков наилучший способ достижения желаемого эффекта?

1 Ответ

2 голосов
/ 11 марта 2019

Вы можете получить из 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);
        }
    }
}
...