NET中的CSS3函数**repeating-linear-gradient()**是否有替代品(类似)(WinForms,而不是WPF)?我需要以45度角绘制重复的“斑马条纹”(例如,红、蓝、绿色、红、蓝、绿...)。
**UPD:**按照Jimi的建议,我只解决了部分问题:
private void DrawRepeatingStripes(int degree, int stripeWidth, Color[] colors, Rectangle rect, Graphics graphics)
{
using (var img = new Bitmap(colors.Length * stripeWidth, rect.Height))
{
using (var g = Graphics.FromImage(img))
{
for (int i = 0; i < colors.Length; i++)
{
// TODO: cache SolidBrush
g.FillRectangle(new SolidBrush(colors[i]), stripeWidth * i, 0, stripeWidth, rect.Height);
}
}
using (var tb = new TextureBrush(img, WrapMode.Tile))
{
using (var myMatrix = new Matrix())
{
myMatrix.Rotate(degree);
graphics.Transform = myMatrix;
graphics.FillRectangle(tb, rect);
graphics.ResetTransform();
}
}
}
}
用法(在某些表单的代码中):
protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground(e);
DrawRepeatingStripes(45, 10, new Color[] { Color.Red, Color.Yellow, Color.Green }, e.ClipRectangle, e.Graphics);
}
问题是旋转是......好吧,一个 * 旋转 ,所以矩形的一部分是充满条纹的,一部分是空的*。不知道怎么解决:(
1条答案
按热度按时间vktxenjb1#
有关使用TextureBrush填充用作画布的控件表面的示例。
LinearRepeatingGradient
类公开可绑定的ColorBands
属性(类型为BindingList<ColorBand>
),该属性允许添加或移除ColorBand
对象,该记录定义要生成的每个带区的颜色和大小。RotationAngle
属性指定要应用于渲染的旋转。在用作画布的Control的
Paint
事件中,调用Fill(Graphics g)
方法,传递由PaintEventArgs
参数提供的e.Graphics
对象。将根据
ColorBands
属性的内容生成新的位图。当旋转Angular 不能被
90
整除时,画布的尺寸将增大其对角线的三分之一(作为与未旋转矩形的最大距离)。TextureBrush将填充此膨胀的表面,因此画布两侧不会留下任何空白。
因为这个测试示例是用. NET 7构建的,所以我使用
record
来存储色带设置,你可以用一个类对象来替换它,而不需要修改其余的代码。同上:
using
declaration而不是using
语句它是这样工作的:
由于ColorBands属性是可绑定的,因此可以在添加或移除ColorBand对象时使用数据绑定来执行操作,还可以将集合绑定到Controls,如动画所示:
因此,当您添加(或移除)一个新的
ColorBand
时,内部集合将发生更改,用作画布的控件将失效,并显示新的填充:RotationAngle
属性不使用数据绑定,所以当你改变它的时候,你必须 * 手动 * 使画布无效。你当然可以改变它,使这个属性成为可绑定的: