在Windows窗体中滚动面板的C#实现

11

我正在使用VS2010和Windows 7。

我有一个带有许多图片框的面板。

AutoScroll = true

滚动条在拖动或点击时正常工作。但是,我希望能够使用鼠标滚轮和箭头键来滚动。
鼠标滚轮没有反应(将事件处理程序添加到表单中也无效,因为当我改变焦点时它停止触发),要使用箭头键,我必须以编程方式滚动。我尝试了以下方法:
panel3.VerticalScroll.Value = panel3.VerticalScroll.Maximum;

这个不起作用,滚动条几乎没有移动。某种原因下最大值总是100。

我尝试解决滚轮问题的方法(不起作用):

// Fires as long as i don't change focus to anything
this.MouseWheel += new MouseEventHandler(Panel1_MouseWheel);

private void Panel1_MouseWheel(object sender, MouseEventArgs e)
{
    panel3.Focus();
}

谢谢你。

感谢您。


在使用鼠标滚轮进行滚动之前,您必须将焦点设置到控件上。请先单击它。 - Cody Gray
不起作用。我点击了面板,它的图片框甚至它的文本框,但滚轮没有反应。 - WoF_Angel
使用 TableLayoutPanel? - Tony Hopkinson
尝试使用TableLayoutPanel和FlowLayoutPanel,但是出现了相同的问题。 - WoF_Angel
3个回答

12

有几个要尝试的事情:

让您的Panel具有第一个TabIndex属性。也就是说:

panel1.TabIndex = 0;

显然,表单上的其他控件应该重新适当地进行索引。

另外,在MouseDown事件中尝试添加焦点:

void panel1_MouseDown(object sender, MouseEventArgs e) {
  if (!panel1.Focused)
    panel1.Focus();
}

您也可以使用MouseEnter事件,但这可能会是一个奇怪的用户界面,因为将鼠标移动到面板上会从当前活动控件中抢占焦点。
您不应该需要订阅MouseWheel事件。它应该自动移动滚动条。

3

通过分配AutoScrollPosition属性来滚动Panel。请注意,它使用负值。

鼠标滚轮不起作用的原因是面板和图片框均不是可聚焦控件。您需要稍微改进面板控件以使其能够聚焦。您可以在此答案中找到代码。


0

尝试

private void panel1_MouseEnter(object sender, EventArgs e)    
{    
   panel1.Focus();    
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接