2014-02-12 102 views
1

我從得到這UserControl,我只希望顯示一個垂直滾動條。無論如何,我決不能配置爲僅顯示垂直滾動條。這似乎是winforms的缺陷。另一個問題是,只要父級調整大小,使控制變得更小,水平滾動條就會立即顯示,直到OnResize事件處理程序調整寬度。因此,水平滾動條閃爍,因爲它的內容比滾動條控件的寬度更寬。這會使可滾動控件內的組件重新繪製不必要的時間,因爲它們會調整到可用空間。當控制變寬時,水平滾動條從不顯示。ScrollableControl中的閃爍​​滾動條

所以我用Google搜索了一圈,發現這樣的:Add vertical scroll bar to panel in .NET

似乎promosing,但現在這兩個滾動條和麪板的內容,只要它是由這個外部滾動條滾動的閃爍。調整面板寬度變小,顯示和隱藏水平滾動條,並導致不必要的重繪的問題不在此列,因此這是一場勝利。

這是控制的構造是這樣的:

 public BarGraphPanel() 
     { 
      this.HScroll = false; 
      this.VScroll = false; 
      this.AutoScroll = false; 
      this.VerticalScroll.Visible = false; 
      this.HorizontalScroll.Visible = false; 
      this.SetStyle(ControlStyles.UserPaint, true); 
      this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); 
      this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 
      this.SetStyle(ControlStyles.ResizeRedraw, true); 
      this.DoubleBuffered = true; 
     } 

它應該看起來像在滾動什麼:

enter image description here

它看起來像什麼,而滾動:

enter image description here

雖然滾動是我可以接受的東西,但是文本框沒有被很好地繪製,但是兩個滾動條閃爍(所以暫時顯示實際上3個滾動條!)是瘋狂的。

有沒有一種方法只有一個滾動條在屏幕上(總是)沒有任何其他酒吧或其內容閃爍?

+0

至於閃爍,這不是令人耳目一新。 UserControl上的一個良好的'Invalidate()'應該做到這一點。 – DonBoitnott

+0

不要使用該垂直滾動條。只需設置面板的AutoScrollMinSize即可獲取滾動條。 – LarsTech

+0

@DonBoitnott這似乎不夠。雖然在中午之後苦苦掙扎,我終於找到了答案:http://stackoverflow.com/questions/3341032/during-flowlayoutpanel-scrolling-background-distorts-flickers –

回答

1

面板滾動事件的代碼上設置:

private void panel1_Scroll(object sender, ScrollEventArgs e) 
    { 
     panel1.Invalidate(); 
    } 
+0

其實panel1.Referesh()使工作更好 – ephraim