Windows 窗体选项卡控件随背景闪烁

问题描述 投票:0回答:5

我在 Windows 窗体上有一个面板。根据他们单击的按钮将表单加载到面板中。加载到面板中的这些表单之一具有选项卡控件。表单的背景是图像,每次我在选项卡之间切换时,表单都会闪烁。当我将背景图像设置为空或纯色时,它工作正常,因此它必须是图像。有没有办法解决?预先感谢。

c# vb.net tabcontrol windows-forms-designer
5个回答
0
投票

绘制图像的成本很高,尤其是在表单背景上。我发现唯一有帮助的方法是将

BackgroundImageLayout
设置为
None
,这有助于减少我开发的应用程序中的闪烁。

您还可以尝试将

DoubleBuffered
属性设置为
true
但我不确定您能从中获得多少里程。

问题是,当放置在表单上的控件必须重绘时(如更改选项卡页时),该控件下面的所有内容也必须重绘。这会导致您的表单背景失效并重绘,有时会多次,因为失效发生在多个控件上(它们不批处理)。


0
投票

为了解决有关转换为 PArgb32 的后续问题,以下代码可以解决问题:

using System.Drawing;
using System.Drawing.Imaging;

Bitmap originalBmp;
var converted = new Bitmap(originalBmp.Width, originalBmp.Height, PixelFormat.Format32bppPArgb);
using (var g = Graphics.FromImage(converted))
{
    g.DrawImage(0, 0, originalBmp);
}

您仍然需要使用双缓冲控件来减少闪烁,但将图像转换为 PArgb32 应该会大大加快绘图速度。


0
投票

您可以使用无闪烁选项卡面板来解决此问题:

这里是面板控制的示例代码:

public partial class NonFlickerPanel : Panel
{
   public NonFlickerPanel() : base()
   {
          this.SetStyle(ControlStyles.AllPaintingInWmPaint,
                              ControlStyles.UserPaint 
                              ControlStyles.OptimizedDoubleBuffer, 
                              true);
   }
}

0
投票

在标签页上使用 png 作为背景时,效果完美,没有闪烁

public partial class CtechTabPage : TabPage
{
    public CtechTabPage()
    {
        try
        {
            InitializeComponent();

            // Prevent flicker on your custom control
            this.SetStyle(ControlStyles.DoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
            this.DoubleBuffered = true;
        }
        catch (Exception ex)
        {
            Log.Exception(ex);
        }
    }
}

// Convert png to light bitmap
Bitmap pngBackground = new Bitmap(Settings.Default.Background);
Bitmap lightBackground = new Bitmap(pngBackground.Width, pngBackground.Height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
using (var g = Graphics.FromImage(lightBackground))
{
    g.DrawImage(pngBackground, 0, 0);
}
// Put png to BackgroundImageLayout
YourCtechTabPage.BackgroundImageLayout = ImageLayout.Stretch;
YourCtechTabPage.BackgroundImage = lightBackground;

-1
投票

查看

DoubleBuffered
和/或
Image
/
TabControl

属性

如果将其设置为 true,闪烁可能会停止。

© www.soinside.com 2019 - 2024. All rights reserved.