2009-09-15 85 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; 
    } 
}