如何使用鼠标滚轮滚动面板?
Posted
技术标签:
【中文标题】如何使用鼠标滚轮滚动面板?【英文标题】:How can I scroll my panel using my mousewheel? 【发布时间】:2010-12-08 17:03:14 【问题描述】:我的表单上有一个面板,其中 AutoScroll 设置为 true,因此滚动条会自动出现。
我怎样才能使用户可以使用鼠标滚轮滚动面板?谢谢。
【问题讨论】:
【参考方案1】:对我有用的是添加panel1_MouseEnter
EventHandler:
private void panel1_MouseEnter(object sender, EventArgs e)
panel1.Focus();
【讨论】:
谢谢,这个更简单的解决方案对我有用。我有一个填充在面板内的图片框。而不是面板鼠标输入。我做了图片框鼠标输入,解决了我的问题。 这可能会产生非常意想不到的行为,如果您单击文本框或想要编辑其他内容,如果您将鼠标悬停在面板上,这将聚焦面板。我不会这样做..(只是我的意见) 这对我不起作用,因为面板完全被没有将事件向上传递给父级的控件占据,所以面板一开始就没有鼠标进入事件。跨度> 出色、出色且出色的解决方案【参考方案2】:面板或面板中的控件必须具有焦点。请注意,如果具有焦点的控件有滚动条,它将滚动而不是面板。
【讨论】:
嗨约翰,所以我只是将 Focus() 设置为面板控制器,它应该滚动? 没错。您可以调用 panel1.Focus() 或单击面板中的某些内容,它会滚动。 我刚试过这个,它不起作用。鼠标滚轮对面板的滚动条没有影响。也许我做错了什么。 @MusiGenesis:创建一个项目,面板设置为自动滚动,其中包含一个按钮。在按钮下方添加另一个控件并调整面板大小,以便您看不到第二个控件。在运行时,单击按钮(使面板具有焦点),您将能够滚动。你也可以使用 panel.Focus() 而不是点击里面的按钮。 @Jon B:我做了所有这些,但仍然没有滚轮的滚动效果。我能够在 IE 中使用滚轮上下滚动,所以我知道滚轮在工作。【参考方案3】:下面的代码对我有用.....
Public Form
InitializeComponent();
this.MouseWheel += new MouseEventHandler(Panel1_MouseWheel);
private void Panel1_MouseWheel(object sender, MouseEventArgs e)
panel1.Focus();
【讨论】:
这太棒了。更简洁,在父窗体的构造函数中:MouseWheel += (s, e) => myPanel.Focus();
【参考方案4】:
确保您的面板具有焦点。这是滚动面板滚动条的简单代码。希望这有帮助。 :) 在此输入代码
int deltaScroll = 10;
if (e.Delta > 0)
if (pnlContain.VerticalScroll.Value - deltaScroll >= pnlContain.VerticalScroll.Minimum)
pnlContain.VerticalScroll.Value -= deltaScroll;
else
pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Minimum;
else
if (pnlContain.VerticalScroll.Value + deltaScroll <= pnlContain.VerticalScroll.Maximum)
pnlContain.VerticalScroll.Value += deltaScroll;
else
pnlContain.VerticalScroll.Value = pnlContain.VerticalScroll.Maximum;
【讨论】:
【参考方案5】:在设计器文件中,您可以添加以下代码行。 MouseWheel 事件不在“属性”窗口的“事件”列表中。
this.Panel1.MouseWheel+= System.Windows.Forms.MouseEventHandler(this.Panel1_MouseWheel);
Panel1_MouseWheel 将在您滚动鼠标时触发
在.cs文件中添加代码
【讨论】:
对于后代 - 除非面板上的控件具有焦点,否则不会触发 MouseWheel 事件,如接受的答案中所述。届时,面板将自动滚动 - 但此事件将可用于进一步自定义。【参考方案6】:我正在使用一个将 BorderStyle 设置为 none 的 windows 窗体,我使用一个面板来包含我的所有控件,所以它看起来不错(颜色差异等..)在我有其他窗体时遇到了同样的问题工作正常。
我忘记了什么:
public myForm()
InitializeComponent();
this.DoubleBuffered = true;
DoubleBuffered 很神奇,我注意到了..
【讨论】:
【参考方案7】:移动滚轮应触发控件的 MouseMove 事件。 MouseEventArgs 参数有一个名为 Delta 的属性,它给出了鼠标滚轮移动的(有符号的)槽口数。您可以使用此属性来滚动面板。
【讨论】:
只是为了后代-这确实触发了 MouseMove 事件,但据我所知,Delta 属性(尽管它的 IntelliSense 与您上面的陈述一致)始终为 0。更多在这里 - social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/…【参考方案8】:Beam022 提供的solution(见上图)对我有用,而许多其他解决方案却没有。就我而言,我试图用鼠标滚轮事件滚动 DataGridView 控件。
正在调用 DataGridView_MouseWheel 事件处理程序,但 FirstDisplayedScrollingRowIndex 值从未更改。即使明确将其设置为 1,该值也始终为“0”。就好像该属性是只读的。
在 .Net Framework 4.6 中仍然是 repro。
【讨论】:
意识到我什至不需要使用特殊代码来使用鼠标滚轮滚动网格,因此我能够删除一堆不必要的代码,包括有问题的 FirstDisplayedScrollingRowIndex。将焦点设置到 DataGridView 控件就足够了。【参考方案9】:在我的例子中,面板的整个客户区都被 UserControls 占据了(除了滚动条之外,内部区域没有一个像素可见)。
在这种情况下,面板不会获得鼠标事件并且永远不会聚焦(显然,单击滚动条不算作“在面板内”)。
我必须在我的 UserControl 派生类的构造函数中添加以下几行:
MouseEnter += delegate
Parent?.Focus();
;
现在它工作正常,因为我在 UserControls 中没有可滚动的内容。
【讨论】:
以上是关于如何使用鼠标滚轮滚动面板?的主要内容,如果未能解决你的问题,请参考以下文章