如何使用鼠标滚轮滚动面板?

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 中没有可滚动的内容。

【讨论】:

以上是关于如何使用鼠标滚轮滚动面板?的主要内容,如果未能解决你的问题,请参考以下文章

ulli鼠标滚轮水平滚动

如何让DbGrid支持鼠标滚轮滚动

需要鼠标滚动滚动用户控件

在Edge里鼠标滚轮一动,页面就前进或后退了。怎样取消这个功能?

如何在面板上捕获鼠标滚轮?

JS如何判断鼠标滚轮事件分析