2009-03-04 61 views
3

我有我创建的用户控件。我在其右侧添加了一个面板和一个垂直滚动条。我希望能够用鼠标滚轮来滚动它。问题是,似乎没有任何事件在鼠标轮上发射。如果我关闭了面板,那么usercontrol会有焦点,它会在表格中的鼠标滚轮上触发。但是面板上的面板似乎不会触发面板的鼠标滚轮事件或控件内甚至窗体上的用户控件。最好的解决方案是在用户控件中有一个事件触发器,但我甚至会接受表单上的事件并将其反馈回usercontrol。需要mousewheel滚动usercontrol

我使用vb.net和vs2005,如果它很重要。

回答

2

我一直在研究这个了一整天,我可能已经想通了这一点。 mousewheel事件只发送给焦点控件。面板不能有焦点。由于面板覆盖了用户控件,因此无法获得焦点。 (除非它是窗体上的唯一控件)如果在面板上的mouseenter事件中,我调用me.focus它将焦点设置为usercontrol,以允许它接收mousewheel事件。事件在窗体和控件中都触发。如果还有更好的方法,我仍然乐于接受建议,因为这看起来有点不合理。

1

Here是一篇关于在vb.net中使用鼠标事件的文章。它特别提到鼠标滚动。

2

做到这一点 -

  • 创建一个新的VB.NET WinForms项目
  • 广场形式
  • 在面板控制设置在面板的“自动滚动”属性设置为“真”
  • 在表格的加载事件中放置以下代码

     For i As Integer = 1 To 100 
      Dim b As New Button() 
      b.Text = i.ToString() 
      b.Size = New Size(60, 40) 
      b.Location = New Point(0, (i * b.Height) - b.Height) 
      b.Parent = Panel1 
      Panel1.Controls.Add(b) 
     Next 
  • 运行该项目。

您应该在面板控件中看到一个带有100个按钮的窗体。面板控件应该包含一个垂直滚动条。使用面板内的滚轮应滚动按钮。

希望这个例子有所帮助。

编辑

我添加了一个面板和垂直滚动条到它的右侧。

这不是正确的做法。您需要使用面板的autoscroll属性。

编辑 - 另一个例子

  • 创建一个新的VB.NET项目
  • 窗体上放置两个按钮
  • 创建一个新的用户控件
  • 设置用户控件的自动滚屏属性true
  • 将以下代码粘贴到表单加载事件中

     Dim uc As New UserControl1 
     uc.Parent = Me 
     Me.Controls.Add(uc) 
     uc.Size = New Size(100, 100) 
     uc.Location = New Point(0, 0) 
     For i As Integer = 1 To 100 
      Dim b As New Button() 
      b.Text = i.ToString() 
      b.Size = New Size(60, 40) 
      b.Location = New Point(0, (i * b.Height) - b.Height) 
      b.Parent = uc 
      uc.Controls.Add(b) 
     Next 
  • 运行该程序。点击按钮(在表单上)。注意,您必须单击usercontrol来设置其焦点并使用滚轮。
+0

谢谢,设置该示例帮助我找出解决方法。我的问题完全来自于使用usercontrol。在窗体上执行面板的工作。 – dwidel 2009-03-04 22:28:21

3

是的,面板可以有焦点。你只需要把它放在焦点上,我更喜欢在鼠标上使用。

我做到了,解决了问题。

1

您还可以添加以下代码行:

private void UserControl1_Scroll(object sender, ScrollEventArgs e) 
    { 
     System.Diagnostics.Debug.WriteLine(System.DateTime.Now.ToString("hh:mm:ss") + " Scrolling inside" + e.NewValue + " <- " + e.OldValue); 
     this.VerticalScroll.Value = e.NewValue; 
    } 

这可以让你看到在控制项目,当您移动滚动条上下。没有它时,控件只在滚动条被释放时滚动。