2009-03-04 63 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; 
    } 

這可以讓你看到在控制項目,當您移動滾動條上下。沒有它時,控件只在滾動條被釋放時滾動。