您好我正在使用.net中的表單,並且我正在運行時動態地添加大量鏈接的標籤,我將這些鏈接標籤添加到面板並將該面板添加到winform。當沒有linklabels增加表格放出一個自動滾動條(垂直)... 現在,當我向下滾動使用該自動滾動窗體不更新其視圖,因爲我滾動時,只有當我停止滾動刷新窗體.. 同樣當它刷新它看起來太糟糕..我可以看到它是如何繪製緩慢....平滑滾動.net形式
有沒有人處理過此?
我試過form.refresh()中滾動的事件處理程序,但似乎並沒有幫助..
任何線索?
您好我正在使用.net中的表單,並且我正在運行時動態地添加大量鏈接的標籤,我將這些鏈接標籤添加到面板並將該面板添加到winform。當沒有linklabels增加表格放出一個自動滾動條(垂直)... 現在,當我向下滾動使用該自動滾動窗體不更新其視圖,因爲我滾動時,只有當我停止滾動刷新窗體.. 同樣當它刷新它看起來太糟糕..我可以看到它是如何繪製緩慢....平滑滾動.net形式
有沒有人處理過此?
我試過form.refresh()中滾動的事件處理程序,但似乎並沒有幫助..
任何線索?
嘗試將窗體的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之後,您可以使用這些事件來更改面板的頂層位置,從而實現動態滾動效果您正在尋找。
這有點令人氣憤,面板默認不以這種方式工作,或者甚至有一個啓用它的設置。
將這個彈出到你的類(用戶控件,面板等),然後它將使用拇指拖動。
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);
}
如果你不想使用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;
}
}
沒了,似乎並沒有工作:( – FatDaemon 2009-09-15 00:26:32
呀,看我的更新。 – MusiGenesis 2009-09-15 00:29:49
我試圖完全相同的事情 公共部分類CustomPanel:面板 { 公共CustomPanel() { 的InitializeComponent(); this.DoubleBuffered = TRUE; this.AutoSize = true; this.AutoSizeMode = AutoSizeMode.GrowAndShrink; } 沒有工作...後,才鬆開鼠標按鈕 形式/面板被更新,而不是同時鼠標點擊滾動條滾動和向下.. – FatDaemon 2009-09-15 00:47:49