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

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

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

3 ответа

Решение
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.

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

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

Я надеюсь, что это поможет вам.

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