2010-07-23 6 views
2

я должен написать несколько небольших вертикальных градиентов (на петле), и поэтому я думаю, что это быстрее, чтобы повторно использовать существующий LinearGradientBrush (правильно?)Как изменить цвета GDI + LinearGradientBrush?

Но это не то, что я ожидал, чтобы это произошло ...

Drawing2D.LinearGradientBrush myBrush = new Drawing2D.LinearGradientBrush(new Rectangle(0, 0, 200, 200), Color.Red, Color.Black, Drawing2D.LinearGradientMode.Vertical); 
    myBrush.LinearColors[1] = Color.Blue; 
    MsgBox(myBrush.LinearColors[1].ToString); //Returns black 

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

Спасибо :)

ответ

2

Построение кисти затраты почти ничто по сравнению с проделанной работой на самом деле сделать что-то с кистью.

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

myBrush.LinearColors = new Color[2] { Color.Blue, Color.Whatever };
+0

Так что создание нового LinearGradientBrush почти такое же, как замена его цветов? –

+0

Я написал очень интерактивное графическое приложение для розничной торговли и обнаружил, что создание новых кистей не оказало существенного влияния на производительность при измерении с помощью dotTrace (что я бы очень рекомендовал для тех, кто пишет приложения, которые сильно используют GDI + или WPF). – Steve

+0

Настройка всего массива , и я буду использовать это! Глупо мне за то, что я не думал об этом раньше. Благодаря! :) –

1

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

Когда вы меняете весь массив градиентов, свойство setter для массива записывает изменения обратно в неуправляемый объект.

+0

Спасибо за информацию - я действительно этого не знал. Теперь, когда я думаю об этом, имеет смысл, что работа над массивом на самом деле получает копию массива, а затем работает над копией. : / –