Una forma de corregir el problema, es especificar el interior PathGradientBrush
's FocusScales , para delimitar el color de la caída-off, sin comprometer la mezcla de colores.
Desafortunadamente, los Documentos no describen realmente para qué se utiliza esta propiedad.
Puede leer una descripción mejor aquí: Cómo: Crear un degradado de ruta
La caída se puede ajustar en las posiciones de color. Como especificaste:
Positions = new float[] { 0.0f, 0.1f, 1.0f }
las caídas de color se pueden configurar en:
brush.FocusScales = new PointF(0.1f, 1.0f);
la escala horizontal se puede ajustar, pero dentro de la mitad de la medida total; de lo contrario, la combinación de colores se verá comprometida: no verá el suavizado de transparencia en los bordes de la forma.
También se logra un mejor resultado configurando PixelOffsetMode en PixelOffsetMode.Half
.
Tenga en cuenta que la descripción en los Documentos es incorrecta, consulte la documentación de C ++ sobre esta configuración .

Una implementación genérica (usando un panel como lienzo ):
(es posible que desee habilitar la pintura solo en un MouseDown
evento)
mousePosition
es la ubicación del puntero del mouse. Se puede configurar en un MouseDown
evento.
private Point mousePosition = Point.Empty;
private float lineSize = 100.0f;
private int shadowDistance = 16;
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
e.Graphics.PixelOffsetMode = PixelOffsetMode.Half;
using (var path = new GraphicsPath(FillMode.Winding))
{
PointF[] arrowPoints = new PointF[] {
mousePosition,
new PointF (mousePosition.X - 20f, mousePosition.Y + 10f),
new PointF (mousePosition.X - 20f, mousePosition.Y + 3f),
new PointF (mousePosition.X - lineSize, mousePosition.Y + 3f),
new PointF (mousePosition.X - lineSize, mousePosition.Y - 3f),
new PointF (mousePosition.X - 20f, mousePosition.Y - 3f),
new PointF (mousePosition.X - 20f, mousePosition.Y - 10f)
};
path.AddLines(arrowPoints);
using (var brush = new PathGradientBrush(path.PathPoints, WrapMode.Clamp))
{
var blend = new ColorBlend()
{
Colors = new Color[] { Color.Transparent,
Color.FromArgb(180, Color.DimGray),
Color.FromArgb(180, Color.DimGray) },
Positions = new float[] { 0.0f, 0.2f, 1.0f }
};
brush.FocusScales = new PointF(0.2f, 1.0f);
brush.InterpolationColors = blend;
e.Graphics.FillPath(brush, path);
}
using (var mx = new Matrix())
{
mx.Translate(-shadowDistance, -shadowDistance);
e.Graphics.Transform = mx;
e.Graphics.FillPath(Brushes.Red, path);
}
}
}