我在 Windows 窗体上有一个面板。根据他们单击的按钮将表单加载到面板中。加载到面板中的这些表单之一具有选项卡控件。表单的背景是图像,每次我在选项卡之间切换时,表单都会闪烁。当我将背景图像设置为空或纯色时,它工作正常,因此它必须是图像。有没有办法解决?预先感谢。
绘制图像的成本很高,尤其是在表单背景上。我发现唯一有帮助的方法是将
BackgroundImageLayout
设置为 None
,这有助于减少我开发的应用程序中的闪烁。
您还可以尝试将
DoubleBuffered
属性设置为 true
但我不确定您能从中获得多少里程。
问题是,当放置在表单上的控件必须重绘时(如更改选项卡页时),该控件下面的所有内容也必须重绘。这会导致您的表单背景失效并重绘,有时会多次,因为失效发生在多个控件上(它们不批处理)。
为了解决有关转换为 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 应该会大大加快绘图速度。
您可以使用无闪烁选项卡面板来解决此问题:
这里是面板控制的示例代码:
public partial class NonFlickerPanel : Panel
{
public NonFlickerPanel() : base()
{
this.SetStyle(ControlStyles.AllPaintingInWmPaint,
ControlStyles.UserPaint
ControlStyles.OptimizedDoubleBuffer,
true);
}
}
在标签页上使用 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;
查看
DoubleBuffered
和/或 Image
/的
TabControl
属性
如果将其设置为 true,闪烁可能会停止。