【问题标题】:Changing the content of Data attribute for Path markup syntax?更改路径标记语法的数据属性的内容?
【发布时间】:2021-07-30 04:46:07
【问题描述】:
<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、LA 等。

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

【问题讨论】:

  • 根据您的实际操作,在代码中创建和修改几何图形可能更简单,而不是复制和修改从 XAML 解析的几何图形。
  • 其实我是新手,我认为从 XAML 开始会更容易,所以我可以直观地弄清楚如何去做,然后用 C# 编码实现它。
  • 也许我应该更好地解释我尝试做的事情。我想创建一个仪表,我正在尝试找到一种方法来构建圆的各个部分(而不是针)。就像这里 -> raw.githubusercontent.com/sheldonyss/ng2-gauge-with-color-band/… 我想让它动态化,所以我可以决定我想要多少段。

标签: c# wpf xaml path markup


【解决方案1】:

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

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

但是,您可以创建当前 Data 的 PathGeometry 副本,对其进行修改并将其传递回 Data 属性。

在下面的代码中,副本仅在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

【讨论】:

  • 这个答案很好!
  • 谢谢,我会试试这个。我也看到了以下内容,但到目前为止它不起作用或没有给我输出。路径 p = 新路径(); p.Fill =画笔.黑色; p.Data = Geometry.Parse("M0,0 L0,-100 A100,100 0 0 1 100,0 z");
  • 您可以在您的类中添加一个 RotateTransform 成员,并通过arc.Point = rotation.Transform(new Point(0, -100)) 设置 ArcSegment 的终点。如果角度大于 180°,您还必须设置 arc.IsLargeArc = true
【解决方案2】:

正如@Clemens 和@aybe 在从字符串解析几何时正确编写的那样,创建了一个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>

【讨论】:

  • 谢谢,这是个好主意。但我的目标是实际从 C# 代码创建所有内容,这样我就可以保持动态,我只使用了 Xaml,因为我认为在那里尝试然后编写代码会更快。但也许我仍然可以用你的方式到达它。我首先创建所有段,然后将其应用到代码中。我的目标实际上是这样的:raw.githubusercontent.com/sheldonyss/ng2-gauge-with-color-band/…(没有针)。但我希望细分的数量是动态的。
  • 这个没有问题。或者创建一个字符串并使用Geometry.Parse(String) MethodGeometryConverter Class 将其转换为几何图形。或者使用派生的 Geomery 类来创建您自己的任何实例。将生成的 Geometry 实例分配给 Data 属性。
  • “我的目标实际上是这样的......” - 不能将多个画笔分配给一个形状。对于具有不同颜色的每个段,您需要创建一个单独的 Shape 实例。如果你用所有必要的数据来补充这个问题来绘制你需要的图片,我可以向你展示一个实现它的代码示例。
猜你喜欢
  • 2013-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2020-01-02
  • 1970-01-01
相关资源
最近更新 更多