Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 能否获取组合几何或GeometryGroup对象的路径标记语法?_C#_Wpf_Geometry - Fatal编程技术网

C# 能否获取组合几何或GeometryGroup对象的路径标记语法?

C# 能否获取组合几何或GeometryGroup对象的路径标记语法?,c#,wpf,geometry,C#,Wpf,Geometry,处理PathGeometry对象时,如果调用ToString()将返回表示路径的“路径标记语法”。但是,对于几何组和组合几何,情况并非如此 考虑以下代码: var hBar = Geometry.Parse("F1M10,20L40,20L40,30L10,30z"); var vBar = Geometry.Parse("F1M20,10L30,10L30,40L20,40z"); var cross = Geometry.Parse("F

处理
PathGeometry
对象时,如果调用
ToString()
将返回表示路径的“路径标记语法”。但是,对于
几何组
组合几何
,情况并非如此

考虑以下代码:

var hBar  = Geometry.Parse("F1M10,20L40,20L40,30L10,30z");
var vBar  = Geometry.Parse("F1M20,10L30,10L30,40L20,40z");
var cross = Geometry.Parse("F1M20,10L20,10L30,10L30,20L40,20L40,30L30,30L30,40L20,40L20,30L10,30L10,20L20,20z");

var combined = new GeometryGroup(){ FillRule = FillRule.Nonzero };
    combined.Children.Add(hBar);
    combined.Children.Add(vBar);

var union = new CombinedGeometry(GeometryCombineMode.Union, HBar.Geometry, VBar.Geometry);

Console.WriteLine($"hBar     : {hBar}");
Console.WriteLine($"vBar     : {vBar}");
Console.WriteLine($"cross    : {cross}");
Console.WriteLine($"combined : {combined}");
Console.WriteLine($"union    : {union}");
以下是图片:

代码的输出如下所示:

hBar:F1M10,20L40,20 40,30 10,30z
vBar:F1M20,10L30,1030,4020,40z
十字线:F1M20,10L20,1030,1030,2040,2040,3030,4020,4020,3010,3010,3010,3010,020,20z
组合:System.Windows.Media.GeometryGroup
联合:System.Windows.Media.CombinedGeometry
我希望得到
CombinedGeometry
GeometryGroup
对象的结果路径标记语法。例如,特别是在“union”的情况下,我希望返回类似于
cross
条目的内容

(*注意:我不关心顶点的顺序或绘图方向,只要它显示为相同的形状/路径。)

这是关于微软的网页。这就是我想要的格式


那么这是可能的吗?

也许我没有抓住要点,但找回路径非常简单

foreach(var child in combined.Children)
{
    Console.WriteLine($" child of combined = {child.ToString()}");
}
Console.WriteLine($" union.Geometry1 = {union.Geometry1}");
Console.WriteLine($" union.Geometry2 = {union.Geometry2}");
这就产生了

child of combined = F1M10,20L40,20 40,30 10,30z
child of combined = F1M20,10L30,10 30,40 20,40z
union.Geometry1 = F1M10,20L40,20 40,30 10,30z
union.Geometry2 = F1M20,10L30,10 30,40 20,40z

是的,只是展平几何体。但是请注意,这将返回几何体的多边形表示形式

union.getFlattedPathGeometry().ToString()

为了保持原始曲线,这里似乎有许多内置的变化,我将把它们留给未来的读者

PathGeometry.CreateFromGeometry(combined).ToString()
PathGeometry.CreateFromGeometry(union).ToString()
Geometry.Combine(hBar, vBar, GeometryCombineMode.Union, null).ToString()

我不是在寻找组成部分。我正在寻找结果几何体的表示。希望这更有意义。@PeterDuniho,这根本不是斯奈德!我真的感觉很糟糕,因为你显然花了很多精力在你的答案上,但这并不是我所问的。我真的建议你把它放回去,因为它会帮助别人!但是事实证明,它不是一条直线,因为这会使曲线几何体变平。不幸的是,我的演示代码都是多边形,所以效果很好,但这也不是很好的解决方案/获得准确标记的唯一方法是让框架使用
XamlWriter
发出XAML。这就是为什么,鉴于您在问题中写了“获取结果路径标记语法”,我发布了答案。很明显,我不知道是谁否决了它,但这就是它引起的所有关注,而且你的明确评论说它没有回答你的问题。因此,没有必要取消删除它,也没有任何理由让我这么做。难道你不想要转换后的标记吗?@PeterDuniho,我(可能是错误的)假设路径标记语法与XAML本身无关。它只是一种简单的几何体序列化格式。也就是说,如果XAMLWriter给出了这个答案,那么我认为这是正确的答案。我目前正在更新我自己的演示代码,添加弧线(而不仅仅是直线段),看看这是否有什么不同。同样,如果XAML版本可以工作,那么我将非常乐意接受它。我只需要首先测试所有场景。
XamlWriter
将发出您的精确对象图。它不会生成原始几何图形的展平版本的几何图形流。它将发出XAML,它将精确地再现原始几何体、分组和包含的组合。坦白地说,在这一点上,你的问题对我来说似乎很不清楚,你到底在寻找什么。标记与几何图形流语法不同,如果您想要一个表示后期组合/分组几何图形的单个几何图形流,则必须自己编写。它不在WPF中。