3

我正在寻找一种方法来使用 WPF 中定义的画笔的径向扫描来填充某些东西。我将在一系列图像中分解我想要的内容,以使其清楚。

假设我在 WPF 中定义了一个画笔,如下所示:

刷子

然后我想像这样使用一片刷子:

用切片刷

并将其平铺在圆的半径上,如图所示:

平铺半径

最后,为了填充形状,我想将画笔扫过圆圈的所有角度,得到类似这样的结果:

扫一圈

在这种特殊情况下,我试图制作同心圆。我知道我可以使用 RadialGradientBrush 实现这一点,但这是一个令人讨厌的解决方案,因为为了精确控制同心圆的宽度,我需要根据圆的大小更改径向停止的数量。更糟糕的是,如果圆圈大小发生变化,除非我使用某种基于圆圈宽度/高度的转换器,否则径向停止不会改变。

我希望有一个干净的解决方案可以用路径或其他东西来做到这一点,但欢迎任何其他关于制作可控大小的圆形切片的建议。

4

2 回答 2

1

关于同心圆情况,将 Clemens 的解决方案与转换器相结合,可以得到精确尺寸的圆,其宽度可以动态改变,并且圆的数量设置为适合允许区域的数量。

class SizeSpacingToCircleGroupConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (values == null) return values;
        var input = values.OfType<double>().ToArray();
        if (input.Length != 3) return values;

        var width = input[0];
        var height = input[1];
        var spacing = input[2];

        var halfSpacing = spacing / 2;
        var diameter = width > height ? height : width;

        var lineCount = (int)Math.Floor((diameter / (2 * spacing)) - 1);
        if (lineCount <= 0) return values;

        var circles = Enumerable.Range(0, lineCount).Select(i =>
        {
            var radius = halfSpacing + (i * spacing);
            return new EllipseGeometry() { RadiusX = radius, RadiusY = radius };
        }).ToArray();

        var group = new GeometryGroup();
        foreach (var circle in circles) group.Children.Add(circle);

        return group;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

和 XAML:

<Rectangle Height="{StaticResource Diameter}" Width="{StaticResource Diameter}">
    <Rectangle.Fill>
        <DrawingBrush Stretch="None">
            <DrawingBrush.Drawing>
                <GeometryDrawing>
                    <GeometryDrawing.Pen>
                        <Pen Brush="{StaticResource ForegroundBrush}" Thickness="{StaticResource SpacingDiv2}"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Geometry>
                        <MultiBinding Converter="{StaticResource SizeSpacingToCircleGroupConverter}">
                            <Binding Source="{StaticResource Diameter}" />
                            <Binding Source="{StaticResource Diameter}" />
                            <Binding Source="{StaticResource Spacing}" />
                        </MultiBinding>
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
            </DrawingBrush.Drawing>
        </DrawingBrush>
    </Rectangle.Fill>
</Rectangle>

就我而言,我只是使用资源字典中定义的双精度,但我可以轻松地使用视图模型中的绑定。

但是,我仍然不会将任何内容标记为已接受的答案,因为问题是关于平铺径向扫描,这可能出于其他原因有用。

于 2013-06-12T14:52:38.490 回答
1

How about this to draw a few concentric circles by use of a Brush?

<Rectangle>
    <Rectangle.Fill>
        <DrawingBrush Stretch="Uniform">
            <DrawingBrush.Drawing>
                <GeometryDrawing>
                    <GeometryDrawing.Pen>
                        <Pen Brush="Black" Thickness="1"/>
                    </GeometryDrawing.Pen>
                    <GeometryDrawing.Geometry>
                        <GeometryGroup>
                            <EllipseGeometry RadiusX="1" RadiusY="1"/>
                            <EllipseGeometry RadiusX="3" RadiusY="3"/>
                            <EllipseGeometry RadiusX="5" RadiusY="5"/>
                            <EllipseGeometry RadiusX="7" RadiusY="7"/>
                            <EllipseGeometry RadiusX="9" RadiusY="9"/>
                            <EllipseGeometry RadiusX="11" RadiusY="11"/>
                        </GeometryGroup>
                    </GeometryDrawing.Geometry>
                </GeometryDrawing>
            </DrawingBrush.Drawing>
        </DrawingBrush>
    </Rectangle.Fill>
</Rectangle>
于 2013-06-11T20:58:02.170 回答