在表单中,我有一个Panel
,其中包含一个PictureBox
,没有其他内容。要求之一是用户应该仅使用键盘就可以滚动浏览面板的内容。换句话说,他们首先需要进入面板,然后使用Up / Down或PageUp / PageDown键进行滚动。
根据Microsoft文档,
TabStop属性对Panel控件无效,因为它是一个 容器对象。
在尝试之后,这似乎是真的。当查找PictureBox的TabStop属性时,它类似于
此属性与此类无关。
我尝试将VScrollBar
添加到面板并将其TabStop
设置为True
,但这似乎无济于事。
达到预期效果的最佳方法是什么?
答案 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);
}
}
}