我创建了一个新的用户控件自定义进度条,但是当在form1设计器中使用它时,通过在form1设计器上拖动控件,进度条几乎每秒 Flink 一次。
进度条我做到了,即使在改变控件大小时,百分比内的文本也将始终保持在中心。问题是用的时候闪个不停。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Lightnings_Detector
{
public partial class CustomProgressBar : UserControl
{
public CustomProgressBar()
{
InitializeComponent();
SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
this.Height = 23;
}
private int _progressValue = 0;
public int ProgressValue
{
get => _progressValue;
set
{
_progressValue = Math.Max(0, Math.Min(100, value));
Invalidate();
}
}
private string _progressText = "";
public string ProgressText
{
get => _progressText;
set
{
_progressText = value;
Invalidate();
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
ProgressBarRenderer.DrawHorizontalBar(e.Graphics, ClientRectangle);
var rect = new Rectangle(ClientRectangle.X, ClientRectangle.Y, (int)(ClientRectangle.Width * ((double)ProgressValue / 100)), ClientRectangle.Height);
ProgressBarRenderer.DrawHorizontalChunks(e.Graphics, rect);
using (var sf = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center })
{
e.Graphics.DrawString(ProgressText, Font, Brushes.Black, ClientRectangle, sf);
}
}
}
}
1条答案
按热度按时间osh3o9ms1#
从文档中:
如果将此属性设置为true,则还应将AllPaintingInWmPaint设置为true。微软学习
因此,您应该使用以下代码行:
如果没有 AllPaintingInWmPaint,当我在设计器中调整进度条大小时,进度条会 Flink 。使用 AllPaintingInWmPaint,在调整大小时不再 Flink 。