1

我正在开发一个需要能够在 WPF 中操作形状和线条的应用程序。我最初的想法是将集合数据绑定到 ListBox 并在数据模板中使用 Rectangles,将每个填充属性设置为图像。这对大多数形状都很有效,除了圆形和一些矩形。由于重新调整图像大小会导致像素化并且线条会改变大小,因此结果并不理想。

我花了一些时间浏览 SO 和其他一些关于 Path 元素的网站,但没有找到任何真正满足我需求的东西。我的猜测是我需要为每种类型的形状生成不同的路径,并使用类似于路径绘图和数据绑定的转换器对它们进行数据绑定,或者使用http://www.telerik.com/help/wpf/raddiagram-overview.html或类似的 rad 工具。

我的问题:有没有更简单的方法来完成这个或任何其他示例?

编辑:我还需要能够添加文本。不知道如何使用路径来做到这一点......也许是 ContentControl?

4

1 回答 1

2

Path.Data您可以通过将 a 数据绑定到 a来绘制各种形状Geometry。您可以Geometry从点列表生成。转换器非常适合这种适应。

例如,我通过将Path.Data属性数据绑定到StreamGeometry我从视图模型管理的点列表中生成的 a 来绘制螺旋线,它非常适合我的需求:

// ViewModel ...
public class ViewModel 
{
    [Notify]
    public IList<Point> Points { get; set; }
}

// Converter ... 
public class GeometryConverter : IValueConverter
{
    public Object Convert(Object value, Type targetType, Object parameter, CultureInfo culture)
    {
        if (value == null || value == DependencyProperty.UnsetValue)
        {
            return value;
        }

        var points = (IList<Point>)value;            
        var i = 0; 
        var newPath = new StreamGeometry();

        using (var context = newPath.Open())
        {
            var begun = false;

            for (var i = 0; i < points.Count; i++)
            {
                var current = points[i];

                if (!begun)
                {
                    begun = true;
                    context.BeginFigure(current, true, false);
                }
                else
                {
                    context.ArcTo(current, new Size(radius, radius), angle, false, SweepDirection.Counterclockwise, true, true);
                }
            }
        }

        newPath.Freeze();
        return newPath.GetFlattenedPathGeometry();
    }
}

XAML:

<Canvas>
    <Path StrokeThickness="{Binding StrokeWidth}"
          Canvas.Top="{Binding Top}"
          Canvas.Left="{Binding Left}"
          Data="{Binding Points, Converter={StaticResource GeometryConverter}}">
        <Path.Stroke>
            <SolidColorBrush Color="{Binding CurrentColor}" />
        </Path.Stroke>
    </Path>
</Canvas>

至于文本,绑定TextBlock元素并根据需要将它们排列在“画布”上不是更好吗?

于 2013-01-11T02:48:31.240 回答