只是一个说明,我会远离选项2.关于选项1,以属性更改已被系统缓存的方式,它只会在UI线程返回处理消息后重绘。至于方案3,似乎有点牵扯。
但是在回答你的问题时,最简单的方法就是在你的班级中创建一个计时器,该计时器在给定的时间间隔内启动。然后有一个布尔,如果它是真的计时器的Tick处理程序将调用Invalidate()并将其设置为false。最后制作一个你将用来代替Invalidate的方法,它将bool标记为true。
有可能是我不知道在你的情况的危害,但这里有一个例子:
public class InvalidationUserControl : UserControl
{
bool _isInvalid = false;
int _data;
Timer t = new Timer();
public InvalidationUserControl()
{
InitializeComponent();
t.Interval = 100; // Go ahead an play with this number, the higher
// it is the greater the latency
t.Tick += t_Tick;
t.Start();
}
void InvalidateIfNeeded()
{
_isInvalid = true;
}
void t_Tick(object sender, EventArgs e)
{
if (_isInvalid)
{
_isInvalid = false;
Invalidate();
}
}
public int Data
{
get { return _data; }
set
{
_data = value;
InvalidateIfNeeded();
}
}
}
可能有更好的办法在那里,但,这是一个快速的解决方案,它可以工作必须是您需要它。
所有你需要做的就是调用InvalidateIfNeeded()而不是Invalidate(),它应该工作。
_if一次更改多个属性,_ ??你的意思是代码而不是用户?为此可以使用Suspend/ResumeLayout,否? – TaW 2015-04-01 06:42:41
@TaW是的我的意思是代码。我不知道挂起/ resumelayout,我会研究它。谢谢 ! – user1950929 2015-04-01 07:11:36