【问题标题】:Multi-color gradient does not show all colors多色渐变不显示所有颜色
【发布时间】:2018-03-09 07:15:41
【问题描述】:

我有一个由 14 种颜色组成的多色渐变。这是我的代码:

panel1.Paint += new PaintEventHandler(panel1_Paint);
panel1.Refresh();

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = e.Graphics;

    LinearGradientBrush br = new LinearGradientBrush(this.ClientRectangle, Color.FromArgb(255, 0, 0, 0), Color.FromArgb(255, 100, 100, 200),0, false);
    System.Drawing.Drawing2D.ColorBlend cb = new System.Drawing.Drawing2D.ColorBlend();
    cb.Positions = new[] { 0, 1 /15f, 2 / 15f, 3 / 15f, 4 / 15f, 5 / 15f, 6 / 15f, 7 / 15f, 8 / 15f, 9 / 15f, 10 / 15f, 11 / 15f, 12 / 15f, 13 / 15f,1 };

    cb.Colors = new[] {
        Color.FromArgb(255, 0, 0, 0),
        Color.FromArgb(255, 0, 0, 50),
        Color.FromArgb(255, 10, 10, 100),
        Color.FromArgb(255, 30, 30, 100),
        Color.FromArgb(255, 70, 70,200),
        Color.FromArgb(255, 100, 100, 255),
        Color.FromArgb(255, 170, 170, 255),
        Color.FromArgb(255, 55, 151, 107),
        Color.FromArgb(255, 117, 194, 103),
        Color.FromArgb(255, 230, 230, 128),
        Color.FromArgb(255, 202, 157, 75),
        Color.FromArgb(255, 185, 154, 100),
        Color.FromArgb(255, 220, 220, 220),
        Color.FromArgb(255, 255, 255, 255),
        Color.FromArgb(255, 100, 100, 200) };

    br.InterpolationColors = cb;
    // rotate
    br.RotateTransform(90);
    // paint
    g.FillRectangle(br, this.ClientRectangle);
}

不幸的是,它没有显示所有颜色。我的矩形的高度是 100,但它显示了这样的渐变:

出了什么问题,我该如何解决?

【问题讨论】:

    标签: c# winforms gradient


    【解决方案1】:

    如果要填充 Rectangle Vertical,则应在 LinearGradientBrush 的构造函数中指定 Rotation:

    new LinearGradientBrush(this.ClientRectangle, colorFrom, colorTo, 90, false);
                                                               Here --^
    

    并删除转换

    br.RotateTransform(90);
    

    由于ClientRectangle 的宽度和高度基本上由您当前的实现交换(因为 90° 旋转),您要么只看到一小部分渐变,要么多次看到整个渐变。

    这也不起作用,因为您使用了错误的ClientRectangle。您在表单的代码隐藏中使用this.ClientRectangle。将每个this.ClientRectangle 替换为panel1.ClientRectangle

    这应该是什么样子:

    您的未修改代码的外观:

    【讨论】:

    • 嗨,谢谢,我照你说的做了,但没有任何改变,问题在于颜色,我有一系列颜色,比如绿色,在这个渐变中没有显示
    • 什么都没有改变了?您是否删除了转换?
    • 是的,我删除了 RotateTransform 并在构造函数中添加了 90
    • @MajidHojati 这就是为什么minimal reproducible example 中的 complete 部分很重要:如果没有所有代码,您还有一个错误并不明显 - 您使用了错误ClientRectangle(见更新的答案)。如果将您拥有的代码放在控件的 OnPaint 覆盖中,您的代码将可以工作,但不能放在您的表单代码后面。
    • 非常感谢,现在已修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    • 2011-04-26
    • 2011-03-06
    • 1970-01-01
    相关资源
    最近更新 更多