您好我正在使用.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