Позвольте мне представить альтернативный взгляд на эту проблему:
Проблема не обязательно в том, что «пользователь все еще изменяет размер элемента управления». Реальная проблема заключается в том, что размер элемента управления изменяется чаще, чем время, необходимое для перерисовки.
Если вы определите проблему как одну из пропускная способность , решение станет проще. И на самом деле у Бибопа была правильная идея с его ответом, но я думаю, что мы можем добиться большего:
public class MyControl : Control
{
private TimeSpan paintTime = 250; // Time to paint, default=250ms
private TimeSpan resizeTime = 100; // Time to update layout, default=100ms
protected override void OnPaint(PaintEventArgs pe)
{
Stopwatch sw = new Stopwatch();
sw.Start();
// Do your painting here, or call base.OnPaint
sw.Stop();
paintTime = sw.Elapsed;
}
protected override void OnResize(EventArgs e)
{
// The "Stop" is not redundant - it will force the timer to "reset"
// if it is already running.
resizeTimer.Stop();
base.OnResize(e);
resizeTimer.Interval =
(int)(paintTime.TotalMilliseconds + resizeTime.TotalMilliseconds);
resizeTimer.Start();
}
private void UpdateSize()
{
Stopwatch sw = new Stopwatch();
sw.Start();
// Resizing code goes here
sw.Stop();
resizeTime = sw.Elapsed;
}
private void resizeTimer_Tick(object sender, EventArgs e)
{
resizeTimer.Stop();
UpdateSize();
}
}
Идея в том, чтобы элемент управления активно профилировался; если вы запускаете его на медленной машине или машина просто работает медленно, это замедлит скорость перерисовки. Если вы используете его на новейшем оборудовании, возможно, вам вообще не придется пропускать какие-либо перерисовки. На самом деле это довольно простой алгоритм «автоматического пропуска кадров», который вы часто видите в эмуляторах устройств.
Чтобы было ясно, я ничего не имею против подхода, отстаиваемого nobugz; единственная причина, по которой я бы выбрал этот вариант, заключается в том, что логика полностью автономна, в то время как предоставление свойства Resizing
(или, возможно, более метко названного EnableFullPaint
) зависит от того, чтобы потребитель знал и использовал его правильно - а также предотвращает перерисовку любых на весь период изменения размера, что может привести к тому, что приложение будет «чувствовать себя» глючно - пользователи не склонны ожидать пустой / бессмысленный экран во время операции изменения размера.
Я использовал оба метода, и они оба работают; какой из них лучше для вас, зависит от ваших требований. Я предлагаю вам попробовать это, посмотреть, насколько хорошо это работает для вас, и если это становится проблематичным или не то, что вы хотите, тогда ответьте nobugz '.