Member 7807309 Ответов: 1

Что не так с моим цветным блеском


Использование сообщества W10/64 и VS 2019, c#
Я пытаюсь сделать простую 3-цветную горизонтальную градиентную заливку. Мне удалось поймать ошибку, но не выяснить точно, в чем проблема. Точка останова на проблемной линии указывала, что colorBlend является правильным. Вот этот код. Я был бы признателен за любую помощь в этом деле.

Rectangle myRectangle = new Rectangle ( x3, y1, x4 - x3, y2 - y1 + 1 );
// fillColor is any arbitrary Color.  Eg Color.Blue
Color[] myColors        = { fillColor, Color.White, fillColor };
float[] myPositions     = { 0f, 0.5f, 1f };
ColorBlend colorBlend   = new ColorBlend ();
colorBlend.Colors       = myColors;
colorBlend.Positions    = myPositions;

LinearGradientBrush linGrBrush = 
   new LinearGradientBrush ( myRectangle,
   fillColor,
   fillColor, LinearGradientMode.Horizontal );

// failure is at the following line.  VS gives this error:
// System.ArgumentException: Property must be set to
// a valid ColorBlend object to use interpolation
// colors. ColorBlend objects must be constructed
// with the same number of positions and color
// values. Positions must be between 0.0 and 1.0, 1.0
// indicating the last element in the array. at
// System.Drawing.Drawing2D.LinearGradientBrush._GetI
// nterpolationColors() indicating the last element in 
// the array. at System.Drawing.Drawing2D.LinearGradientBrush
// ._GetInterpolationColors()        

linGrBrush.InterpolationColors = colorBlend;  // error here

graphicsObject.FillRectangle ( linGrBrush, myRectangle );   


Что я уже пробовал:

Я пробовал устанавливать myColors на фиксированные значения, например, { Color.красный цвет.белый цвет.Красный };
Я попытался изменить linGrBrush на фиксированные цвета, такие как Color.Черный и цветной.Белый.
Я перепробовал все примеры, которые смог найти.
Ошибка, написанная VS, всегда такая же, как и выше.
Если я остановлю точку останова на проблемной линии VS флаги исключение, но проверка colorBlend не показывает никаких ошибок.

Richard MacCutchan

Я только что попробовал этот код, и он работает правильно!

Member 7807309

Спасибо Ричард,
Опубликованный код - это именно то, что я выполняю. Хотя он находится в цикле, где я меняю цвет заполнения, он терпит неудачу в первый раз через цикл.
Спасибо, что запустили код.
Джим

Richard MacCutchan

Ну, это только часть кода, который вы запускаете, так что должно происходить что-то еще.

1 Ответов

Рейтинг:
7

RickZeeland

Работает для меня тоже в VS2019 на Win10 .NET 4.72.
Немного изменено, используя форму Windows с панелью:

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
private void panel1_Paint(object sender, PaintEventArgs e)
{
    Color fillColor = Color.Blue;
    Rectangle myRectangle = new Rectangle(0, 0, this.panel1.Width, this.panel1.Height);

    Color[] myColors = { fillColor, Color.White, fillColor };
    float[] myPositions = { 0f, 0.5f, 1f };
    ColorBlend colorBlend = new ColorBlend();
    colorBlend.Colors = myColors;
    colorBlend.Positions = myPositions;

    LinearGradientBrush linGrBrush = new LinearGradientBrush(myRectangle, fillColor, fillColor, LinearGradientMode.Horizontal);
    linGrBrush.InterpolationColors = colorBlend;
    e.Graphics.FillRectangle(linGrBrush, myRectangle);
}


BillWoodruff

+5

Member 7807309

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

Джим