2009-09-15 173 views
2

您好我正在使用.net中的表單,並且我正在運行時動態地添加大量鏈接的標籤,我將這些鏈接標籤添加到面板並將該面板添加到winform。當沒有linklabels增加表格放出一個自動滾動條(垂直)... 現在,當我向下滾動使用該自動滾動窗體不更新其視圖,因爲我滾動時,只有當我停止滾動刷新窗體.. 同樣當它刷新它看起來太糟糕..我可以看到它是如何繪製緩慢....平滑滾動.net形式

有沒有人處理過此?

我試過form.refresh()中滾動的事件處理程序,但似乎並沒有幫助..

任何線索?

回答

2

嘗試將窗體的DoubleBuffered屬性設置爲True。

更新:實際上,這可能不會做任何事情,因爲您的控件位於窗體的Panel上。內置Panel控件沒有公開的DoubleBuffered屬性,因此實現它的方法是將UserControl名稱DBPanel添加到您的項目中,並更改代碼以使其從面板而不是UserControl繼承(您可以更改此設置添加後在CS文件中手動添加)。當您添加的用戶控件,代碼如下所示:

public partial class DBPanel : UserControl 
{ 
    public DBPanel() 
    { 
     InitializeComponent(); 
    } 
} 

編輯它,使它看起來像這樣(改變用戶控件到面板,並添加「this.DoubleBuffered =真;」行到構造函數):

public partial class DBPanel : Panel 
{ 
    public DBPanel() 
    { 
     InitializeComponent(); 
     this.DoubleBuffered = true; 
    } 
} 

當您生成項目,編譯器將BARF上,與開頭的行「this.AutoScaleMode ......」。刪除這一行並重建。

您現在可以在窗體上使用DBPanel控件來代替常規面板,並且這應該照顧到閃爍問題。

更新2:對不起,我沒有仔細閱讀您的問題。你是對的,在你放開滾動條的大拇指之前,面板不會重新繪製自己。我想要達到這個效果,你只需要創建你自己的UserControl。

基本上你只需要一個帶有VScrollBar的UserControl停靠在右邊,而一個AutoScroll = false的Panel停靠在左邊佔據了剩餘的空間。當您向上和向下移動大拇指時,VScrollBar的Scroll和ValueChanged事件觸發,所以在向內層面板添加一堆LinkLabel之後,您可以使用這些事件來更改面板的頂層位置,從而實現動態滾動效果您正在尋找。

這有點令人氣憤,面板默認不以這種方式工作,或者甚至有一個啓用它的設置。

+0

沒了,似乎並沒有工作:( – FatDaemon 2009-09-15 00:26:32

+0

呀,看我的更新。 – MusiGenesis 2009-09-15 00:29:49

+0

我試圖完全相同的事情 公共部分類CustomPanel:面板 { 公共CustomPanel() { 的InitializeComponent(); this.DoubleBuffered = TRUE; this.AutoSize = true; this.AutoSizeMode = AutoSizeMode.GrowAndShrink; } 沒有工作...後,才鬆開鼠標按鈕 形式/面板被更新,而不是同時鼠標點擊滾動條滾動和向下.. – FatDaemon 2009-09-15 00:47:49

5

將這個彈出到你的類(用戶控件,面板等),然後它將使用拇指拖動。

private const int WM_HSCROLL = 0x114; 
private const int WM_VSCROLL = 0x115; 

protected override void WndProc (ref Message m) 
{ 
    if ((m.Msg == WM_HSCROLL || m.Msg == WM_VSCROLL) 
    && (((int)m.WParam & 0xFFFF) == 5)) 
    { 
     // Change SB_THUMBTRACK to SB_THUMBPOSITION 
     m.WParam = (IntPtr)(((int)m.WParam & ~0xFFFF) | 4); 
    } 
base.WndProc (ref m); 
} 
+0

先生,你是一個紳士。此問題已被竊聽了我的地獄的:) – Martin 2012-12-19 20:04:33

+0

非常歡迎。 – CharlesW 2012-12-23 22:51:19

3

如果你不想使用WinAPI的電話,你可以這樣做:

// Add event handler to an existing panel 
MyPanel.Scroll += new EventHandler(MyPanelScroll_Handler); 

// Enables immediate scrolling of contents 
private void MyPanelScroll_Handler(System.Object sender, System.Windows.Forms.ScrollEventArgs e) 
{ 
    Panel p = sender As Panel; 
    if (e.ScrollOrientation == ScrollOrientation.HorizontalScroll) { 
     p.HorizontalScroll.Value = e.NewValue; 
    } else if (e.ScrollOrientation == ScrollOrientation.VerticalScroll) { 
     p.VerticalScroll.Value = e.NewValue; 
    } 
}