Управление внешним видом дизайнера пользовательского элемента управления с двойной буферизацией в C # /. NET 2.0 - PullRequest
2 голосов
/ 16 ноября 2008

У меня есть пользовательский пользовательский элемент управления, в котором я реализовал двойную буферизацию. Чтобы заставить работать двойную буферизацию без мерцания, я должен переопределить событие OnPaintBackground следующим образом:

protected override void OnPaintBackground(PaintEventArgs e)
{
    // don't even have to do anything else
}

Это прекрасно работает во время выполнения. Проблема в том, что когда у меня есть экземпляр элемента управления в форме во время разработки, он становится черной дырой, которая показывает следы любых окон, перетаскиваемых по нему (поскольку переопределение события OnPaintBackground также управляет внешним видом во время разработки). Это просто косметическая проблема, но она визуально раздражает и всегда заставляет новых разработчиков проекта предполагать, что что-то пошло не так.

Есть ли способ, чтобы переопределенный метод, подобный этому, не был переопределен во время разработки, или есть другое решение?

Ответы [ 3 ]

3 голосов
/ 02 сентября 2009

Решение Стивена Лоу, к сожалению, охватывает все сценарии, особенно, когда пользовательские элементы управления входят в картину.

Флаг this.DesignMode очень обманчив. Его единственная цель - проверить, находится ли прямой родитель в конструкторе.

Например, если у вас есть форма A и UserControl B в конструкторе:

  • A.DesignMode имеет значение true при просмотре в конструкторе
  • B.DesignMode имеет значение false при просмотре A, но true при просмотре непосредственно в B в конструкторе.

Решением этой проблемы является специальный флаг для проверки (извините за уродливый код C ++):

 if(this->DesignMode || 
    LicenseManager::UsageMode == LicenseUsageMode::Designtime) 
    return;

Эта переменная всегда будет отображать правильный логический дизайн.

2 голосов
/ 03 февраля 2010

Решение greggorob64 в C #:

if (DesignMode || LicenseManager.UsageMode == LicenseUsageMode.Designtime) 
{
    return;
}
2 голосов
/ 16 ноября 2008
if (this.DesignMode)
{
    return;    //or call base.OnPaintBackground()
}
...