只是一個說明,我會遠離選項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