2017-04-21 410 views
1

我正在創建一個看起來像這樣的表單。Winforms中的滾動條處理滾動事件

Form1中有兩個面板:

  • 底部面板(黃色)
  • 頂部面板,這是他自己由兩個面板組成:
    • 左側面板(紅色)
    • 右側面板(綠色)

enter image description here

如圖所示,頂部面板超過了form1的高度,所以我想使用滾動條。我有幾個問題:

a)在頂部面板中將自動滾動設置爲true不起作用。

B)如果我把頂部面板,其位置上的按鈕超過Form1的高度,那麼它滾動,但如果我把它放在任何其子面板(紅色或綠色)

C),而不是設置在頂部面板自動滾動到true,我可以創建自己的滾動條,但我找不到一個處理滾動事件的簡單示例,該滾動事件移動面板,以便視圖端口根據需要進行更改。

我該如何正確添加一個具有所需行爲的滾動條?

+0

你想在哪裏滾動條,在窗體上還是在黃色面板上? – vendettamit

+0

@vendettamit我想在由「紅色」和「綠色」面板組成的「頂部」面板中有一個垂直滾動條 – de3

+1

這三個面板看起來應該都是停靠的 - 底部,左側和填充。爲希望滾動條顯示的面板設置AutoScrollMinSize。 – LarsTech

回答

0

正如LarsTech和Hans Passant所建議的,AutoScrollMinSize工作,所以a和b問題得到了解決。

關於問題C,我認爲有一種方法可以創建一個滾動條,這樣它的行爲就像我猜99%的滾動條應該表現出來(只是移動所需的面板)。最後,我自己編寫了這個邏輯。

我添加了一個Scrollbar1作爲基本窗體的控件。 initialPanelY捕獲在構造函數上。

這是響應滾動事件的代碼。我只是移動面板panelRest2的Y位置取決於滾動條的值

using System; 
. 
. 
using System.Windows.Forms; 

namespace WindowsFormMyTests 
{ 
    public partial class Form1 : Form 
    { 
    int initialPanelY; 
    public Form1() 
    { 
     InitializeComponent(); 
     initialPanelY = this.panelRest2.Location.Y; 
    } 

    private void vScrollBar1_Scroll(object sender, ScrollEventArgs e) 
    { 
     int v = (sender as VScrollBar).Value; //between 1 and 100 
     int hiddenPanelHeight = this.panelRest2.Size.Height - this.Size.Height; 
     float moveY = (float)hiddenPanelHeight * ((float)v/100); 
     int newY = initialPanelY - (int)moveY; 
     this.panelRest2.Location = new Point(this.panelRest2.Location.X, newY); 
    } 
    } 
}