Como alterar as cores de um GDI+ LinearGradientBrush?
-
28-09-2020 - |
Pergunta
Eu tenho que escrever vários pequenos gradientes verticais (em um loop) e então acho que é mais rápido reutilizar um LinearGradientBrush existente (correto?)
Mas não era isso que eu esperava que acontecesse...
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
Então, há um erro no código acima, ou uma maneira melhor de obter vários gradientes verticais em um loop, ou uma maneira diferente de alterar as cores do LinearGradientBrush?
Obrigado :)
Solução
Construir um pincel não custa quase nada comparado ao trabalho feito para realmente desenhar algo com o pincel.
Além disso, tente definir o array inteiro em vez de substituir um único elemento.
myBrush.LinearColors = new Color[2] { Color.Blue, Color.Whatever };
Outras dicas
Isso talvez seja acadêmico (e talvez muito disso seja óbvio em retrospecto!), mas a razão pela qual alterar uma única cor não funciona é que as cores são extraídas de código não gerenciado antes de serem apresentadas a você - você recebe uma cópia da cor e é isso que você está mudando.Ou, para ser mais formal, o valor l na sua instrução é passado por valor e não há mecanismo para atualizar o original.
Quando você altera toda a matriz de gradiente, o configurador de propriedades da matriz grava as alterações de volta no objeto não gerenciado.