为什么将 LinearGradientBrush.WrapMode 设置为 Clamp 会因 ArgumentException ("parameter is not valid") 而失败?

Why does setting LinearGradientBrush.WrapMode to Clamp fail with ArgumentException ("parameter is not valid")?

这是一个例子:

public MainForm()
    {
        InitializeComponent();

          LinearGradientBrush brush = new LinearGradientBrush(new Rectangle(0,0,100,100),Color.Blue, Color.White,angle:0);
          brush.WrapMode = WrapMode.Tile; // OK
          brush.WrapMode = WrapMode.Clamp; // Causes Unhandled exception alert, offering break
    }

在 VS2008 输出中 window 这表明:

A first chance exception of type 'System.ArgumentException' occurred in System.Drawing.dll Additional information: Parameter is not valid.

(图片http://i.imgur.com/nM2oNm1.png)

这是在 Windows 7.

文档在这里 https://msdn.microsoft.com/en-us/library/vstudio/system.drawing.drawing2d.lineargradientbrush.wrapmode(v=vs.90).aspx

确认 LinearGradientBrush.WrapMode 接受 WrapMode

"获取或设置一个 WrapMode 枚举,它指示此的环绕模式 线性渐变画笔。

还有这个 https://msdn.microsoft.com/en-us/library/vstudio/system.drawing.drawing2d.wrapmode(v=vs.90).aspx

确认WrapMode.Clamp对梯度有效:

"Clamp The texture or gradient is not tiled."

我可以在 Windows 8.1.

上用 VS2015 确认这一点

这对我来说像是一个错误,因为 Clamp 即直到继续,最后一种颜色可能会非常有用。

您可以尝试使用 InterpolationColors 解决方法,但这需要对要填充的尺寸有一些了解..

有关使用 InterpolationColors

的代码示例,请参阅 and espcially

更新: Lars 的想法看起来也很有趣:用 LinearGradientBrush 创建一个 tile 然后用 TextureBrush..

对我来说,使用 SetInterpolationColors (C++) 缩放矢量并重复结束颜色效果很好。我在两端留下 10 * VectorSize 的 space 并标准化停止点。