web-dev-qa-db-ja.com

WPF C#パス:コード内のジオメトリへのパスデータを含む文字列から取得する方法(XAMLではない)

コードでWPF Pathオブジェクトを生成したい。

XAMLではこれを行うことができます。

 <Path Data="M 100,200 C 100,25 400,350 400,175 H 280">

コードで同じことを行うにはどうすればよいですか?

 Path path = new Path();
 Path.Data = "foo"; //This won't accept a string as path data.

PathDataの文字列をPathGeometryなどに変換するクラス/メソッドがありますか?

確かにXAMLが解析され、データ文字列が変換されますか?

67
Peterdk
var path = new Path();
path.Data = Geometry.Parse("M 100,200 C 100,25 400,350 400,175 H 280");

Path.DataはGeometryタイプです。を使用して リフレクター JustDecompile (eff Red Gate)、TypeConverterAttribute(xamlシリアライザーがstring型の値をGeometry型に変換するために使用する)のGeometryの定義を見ました。これにより、GeometryConverterが示されました。実装を確認すると、Geometry.Parseは、パスの文字列値をGeometryインスタンスに変換します。

130
Will

バインディングメカニズムを使用できます。

var b = new Binding
{
   Source = "M 100,200 C 100,25 400,350 400,175 H 280"
};
BindingOperations.SetBinding(path, Path.DataProperty, b);

それがあなたのお役に立てば幸いです。

20
dbvega

元のテキスト文字列からジオメトリを作成するには、System.Windows.Media.FormattedTextクラスとBuildGeometry()メソッドを使用できます。

 public  string Text2Path()
    {
        FormattedText formattedText = new System.Windows.Media.FormattedText("Any text you like",
            CultureInfo.GetCultureInfo("en-us"),
              FlowDirection.LeftToRight,
               new Typeface(
                    new FontFamily(),
                    FontStyles.Italic,
                    FontWeights.Bold,
                    FontStretches.Normal),
                    16, Brushes.Black);

        Geometry geometry = formattedText.BuildGeometry(new Point(0, 0));

        System.Windows.Shapes.Path path = new System.Windows.Shapes.Path();
        path.Data = geometry;

        string geometryAsString = geometry.GetFlattenedPathGeometry().ToString().Replace(",",".").Replace(";",",");
        return geometryAsString;
    }
4