更改路径标记语法的数据属性的内容?

问题描述

<Path x:Name="Part" Fill="Red" Data="M0,0 L0,-100 A100,100 0 0 1 100,0 z" Margin="261,197,-261,-197" />

如何在 C# 代码中访问相应更改的所有数据? 我可以更改颜色等,但我无法访问 M、L A 等。

SolidColorBrush mySolidColorBrush = new SolidColorBrush();
mySolidColorBrush.Color = Color.FromArgb(255,255,255);
Part.Fill = mySolidColorBrush;

解决方法

从 XAML 解析时,Data 属性包含一个不可变的 StreamGeometry,它

定义使用 StreamGeometryContext 描述的几何形状。此几何体是 PathGeometry 的轻量级替代品:它不支持数据绑定、动画或修改。

然而,您可以创建当前数据的 PathGeometry 副本,对其进行修改并将其传递回数据属性。

在下面的代码中,只有当 Data 不包含可修改的 PathGeometry 时才会创建副本,因此当您多次调用它时,只会创建一个副本。

if (!(Part.Data is PathGeometry path) || path.IsFrozen)
{
    path = PathGeometry.CreateFromGeometry(Part.Data);
}

foreach (var figure in path.Figures)
{
    foreach (var segment in figure.Segments)
    {
        if (segment is ArcSegment arc)
        {
            arc.Point = new Point(0,100);
        }
        //else if ...
    }
}

Part.Data = path;

有关所有不同细分类型的详细信息,请参阅 Path Geometries

,

正如@Clemens 和@aybe 在从字符串解析 Geometry 时正确写入的那样,创建了一个 StreamGeometry 实例。
但是你可以设置你自己的 Geometry 而不是字符串,然后你就可以访问它的每个元素。
这些片段中的任何一个都可以更改、动画、删除、添加。

<UniformGrid Columns="1">
    <Path x:Name="Part" Fill="Red" Data="M0,0 L0,-100 A100,100 0 0 1 100,0 z" VerticalAlignment="Center" HorizontalAlignment="Center" />
    <Path x:Name="PathFullSintacsis" Fill="Red" VerticalAlignment="Center" HorizontalAlignment="Center">
        <Path.Data>
            <PathGeometry x:Name="PartFullGeometry">
                <PathFigure x:Name="PartFullFigure" StartPoint="0 0" IsClosed="True">
                    <LineSegment x:Name="PartFullLine"  Point="0 -100"/>
                    <ArcSegment x:Name="PartFullArc" Point="100 0" RotationAngle="90" Size="100 100" SweepDirection="Clockwise"/>
                </PathFigure>
            </PathGeometry>
        </Path.Data>
    </Path>
</UniformGrid>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...