Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
滚动期间面板背景不刷新(C#/VB.net)_C#_Vb.net - Fatal编程技术网

滚动期间面板背景不刷新(C#/VB.net)

滚动期间面板背景不刷新(C#/VB.net),c#,vb.net,C#,Vb.net,我在C#和VB.net中有一个奇怪的滚动/背景错误。 当我创建一个面板并使用Autoscroll时,在滚动期间背景不会更新。 最后看起来真的很奇怪(视频:) 我用TabControl做了同样的尝试,背景像应该的那样滚动。 我尝试了外部滚动条,同样的情况也发生了。我也试过VB.net。 我认为这是一个来自视觉工作室的错误,如果有人能帮助我,我将不胜感激 谢谢,LG 如果您想使用滚动条滚动图像,只需扩展面板并覆盖OnPaintBackground即可轻松完成 请记住,如果执行此操作,则必须将控件设置

我在C#和VB.net中有一个奇怪的滚动/背景错误。 当我创建一个面板并使用Autoscroll时,在滚动期间背景不会更新。 最后看起来真的很奇怪(视频:) 我用TabControl做了同样的尝试,背景像应该的那样滚动。 我尝试了外部滚动条,同样的情况也发生了。我也试过VB.net。 我认为这是一个来自视觉工作室的错误,如果有人能帮助我,我将不胜感激
谢谢,LG

如果您想使用滚动条滚动图像,只需扩展
面板
并覆盖
OnPaintBackground
即可轻松完成

请记住,如果执行此操作,则必须将控件设置为双缓冲(在下面的代码中为您执行此操作)

在本例中,我添加了一个“平铺”选项。因此,您可以使用一个大图像,或者使用无缝平铺并平铺它(通过
BackgroundImageLayout
属性设置。所有其他选项都将绘制相同的图像)

C#
如何使用此功能

  • 右键单击项目并在菜单中选择
    添加
    ,然后选择
    。命名类
    PanelEx.vb
  • 将上面的代码复制并粘贴到该类文件中
  • 在包含要修改的面板的表单中,进入设计器文件(查看下图)
  • Panel
    的所有实例更改为
    PanelEx
  • 保存,执行完整重建并运行

  • 我对C有点陌生,所以我真的不明白你刚才做了什么,通常我用VB。你能不能把这件事告诉我,或者你能上传这个项目?这是我要下载的项目:它只是一个简单的测试程序。问题出在视频中()。如果你能修改我的测试程序,那将非常有帮助。我真的很感激你能帮助我,谢谢你。哇,它真的起作用了。谢谢:)有没有办法在VB.net中做同样的事情?@zkevin--我已经10年没有写VB.net代码了,但我会试一试:)谢谢你,我真的很感谢你,再次感谢你!它工作得非常好,现在我终于可以继续我的程序了。谢谢:)实现面板的滚动事件,在事件处理程序中调用面板的Invalidate()方法。它确实像一个廉价的汽车旅馆一样闪烁,但是如果图像不是最佳的,这就是《汉帕桑》的主题——我下面的解决方案有什么问题吗?它一点也不闪烁,并且有平滑的滚动。
    using System.Drawing;
    using System.Windows.Forms;
    
    public class PanelEx : Panel
    {
        public PanelEx()
        {
            DoubleBuffered = true;
        }
    
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            if (BackgroundImage != null)
            {
                if (ImageLayout.Tile == BackgroundImageLayout)
                {
                    for (int x = 0; x <= DisplayRectangle.Width;
                        x += BackgroundImage.Width)
                    {
                        for (int y = 0; y <= DisplayRectangle.Height;
                            y += BackgroundImage.Height)
                        {
                            e.Graphics.DrawImage(BackgroundImage,
                                new Point(x - HorizontalScroll.Value,
                                    y - VerticalScroll.Value));
                        }
                    }
                }
                else
                {
                    e.Graphics.DrawImage(BackgroundImage,
                        new Point(-HorizontalScroll.Value, -VerticalScroll.Value));
                }
            }
            else
            {
                base.OnPaintBackground(e);
            }
        }
    }
    
    Public Class PanelEx
        Inherits Panel
    
        Public Sub New()
            DoubleBuffered = True
        End Sub
    
        Protected Overrides Sub OnPaintBackground(e As PaintEventArgs)
            If Not BackgroundImage Is Nothing Then
                If BackgroundImageLayout = ImageLayout.Tile Then
    
                    Dim x As Integer, y As Integer
                    While x <= DisplayRectangle.Width
                        y = 0
                        While y <= DisplayRectangle.Height
                            e.Graphics.DrawImage(
                                BackgroundImage,
                                New Point(x - HorizontalScroll.Value,
                                          y - VerticalScroll.Value))
                            y += BackgroundImage.Height
                        End While
                        x += BackgroundImage.Width
                    End While
                Else
                    e.Graphics.DrawImage(BackgroundImage,
                                         New Point(-HorizontalScroll.Value,
                                                   -VerticalScroll.Value))
                End If
            Else
                MyBase.OnPaintBackground(e)
            End If
        End Sub
    End Class