1

私は、WPF で図形と線を操作できるようにする必要があるアプリケーションに取り組んでいます。私の最初の考えは、コレクションを ListBox にデータバインドし、データ テンプレートで Rectangles を使用して、各塗りつぶしプロパティを画像に設定することでした。これは、円といくつかの長方形を除いて、ほとんどの形状でうまく機能しています。画像のサイズを変更するとピクセル化が発生し、線のサイズが変更されるため、結果は恒星よりも低くなります.

SO や Path 要素に関する他のいくつかのサイトを閲覧するのに時間を費やしましたが、私のニーズを本当に満たすものは見つかりませんでした。私の推測では、形状の種類ごとに異なるパスを生成し、パスの描画とデータ バインディングと同様のコンバーターを使用してそれらをデータバインドするか、http://www.telerik.com/help/wpf/raddiagram-overview.htmlまたは同様の rad ツール。

私の質問: これまたは他の例を達成する簡単な方法はありますか?

編集:テキストを追加できる必要もあります。パスでそれを行う方法がわかりません...おそらくContentControlですか?

4

1 に答える 1

2

Path.Dataaを a にデータバインドすることにより、あらゆる種類の形状を描画できますGeometryGeometryポイントのリストからを生成できます。コンバーターは、この適応に最適です。

たとえば、ビュー モデルによって管理されるポイントのリストから生成する にPath.Dataプロパティをデータ バインドすることでスパイラルを描画しますStreamGeometry。これは私のニーズに非常に適しています。

// 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必要に応じて要素をバインドして「Canvas」上に配置した方がよいのではないでしょうか。

于 2013-01-11T02:48:31.240 に答える