WPF С# Путь: как получить из строки с данными пути в геометрию в коде (не в XAML)

Я хочу создать объект Path WPF в Code.

В 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 анализируется и преобразуется строка данных?

Ответ 1

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

Path.Data имеет тип Geometry. Используя Reflector JustDecompile (eff Red Gate), я просмотрел определение Geometry для его TypeConverterAttribute (которое сериализатор xaml использует для преобразования значений типа string в Geometry). Это указывало на GeometryConverter. Проверив реализацию, я увидел, что она использует Geometry.Parse для преобразования строкового значения пути в экземпляр Geometry.

Ответ 2

Вы можете использовать механизм привязки.

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

Надеюсь, это поможет вам.

Ответ 3

Чтобы сделать геометрию из исходной текстовой строки Вы можете использовать класс 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;
    }