Ошибка рисования градиента - PullRequest
0 голосов
/ 04 июня 2010

У меня проблемы с вызовом рисования градиента. У меня есть форма, которая выглядит следующим образом.

Снимок экрана http://img413.imageshack.us/img413/3570/30364682.png

Проблема в том, что время от времени начинает появляться вышеупомянутая ошибка рисования градиента. Это должно идти прямо через конечно. Иногда для исправления требуется лишь некоторое построение-перестройка-затирание, и он просто и снова «запускается» после сборки время от времени.

Этот элемент управления (верхняя белая часть) является TableLayoutPanel. BackColor установлен в белый цвет, и на событии панели Paint я делаю это:

/// <summary>
/// Draws the background gradient.
/// </summary>
private void titleBarLayoutPanel_Paint(object sender, PaintEventArgs e)
{
    Brush brush = new LinearGradientBrush(titleBarLayoutPanel.Bounds, TaskHeaderLeftColor, TaskHeaderRightColor, LinearGradientMode.Horizontal);
    e.Graphics.FillRectangle(brush, titleBarLayoutPanel.Bounds);
}

Должен ли я заниматься чем-то другим? Проблема в том, что он работает, и тогда без перестройки или сборки это начнет происходить!

РЕДАКТИРОВАТЬ С тех пор я перестроил библиотеку классов, в которой она содержится (это общая форма), затем перестроил приложение, в котором он используется, и градиент теперь полностью заполняется. Это странно.

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Сборка и перестройка вашего приложения без изменений, как правило, не решает эту проблему (или большинство других ошибок), за исключением тех, в которых вы запускаете приложение, без предварительной очистки / перестройки, а затем уведомления что код, который вы только что написали, не работает (не уверен, что это возможно в наши дни с IDE). Я часто вижу это с новыми разработчиками, когда они продолжают перестраивать, надеясь, что компилятор сделает код «правильным» или что компилятор просто не генерирует правильный код для начала. (Обратите внимание, что я не имею в виду вышеупомянутые заявления, которые следует принимать пренебрежительно.)

Чтобы решить данную проблему, вы можете попробовать создать собственный класс TableLayoutPanel, в котором вы переопределяете событие OnBackgroundPaint, рисуете свой собственный фон или просто возвращаете его, если не хотите рисовать свой собственный фон. (Кажется, вы рисуете фон в событии Paint ). В приведенном выше коде вы просто закрашиваете фон, уже закрашенный элементом управления, отсюда и «ошибка» (двойная закраска). Похоже, что форма не изменяемого размера. Попробуйте сделать его изменяемого размера. Затем измените его размер и наблюдайте за его окраской, или просто переместите другие окна поверх него.

class CustomTableLayoutPanel : TableLayoutPanel
{
    protected override void OnPaintBackground(PaintEventArgs e)
    {
        Brush brush = new LinearGradientBrush(this.ClientRectangle, TaskHeaderLeftColor, TaskHeaderRightColor, LinearGradientMode.Horizontal);
        e.Graphics.FillRectangle(brush, this.ClientRectangle);
        //base.OnPaintBackground(e);
    }
}
0 голосов
/ 04 июня 2010

Кстати, вы должны заменить Bounds на ClientRectangle.
Bounds - прямоугольник элемента управления относительно его родителя; ClientRectangle относится к самому элементу управления.
В данном конкретном случае это не будет иметь значения, так как элемент управления равен 0, 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...