Geometry.Combine不适用于曲线

时间:2016-08-17 18:15:16

标签: wpf

我想组合两条曲线,如下所示: Legacy and Standard 那么这是我的代码:

// Create a path to draw a geometry with.
Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
var gmy1 = (StreamGeometry)StreamGeometry.Parse("M100,100C110,118.333333333333 138.333333333333,206.666666666667 160,210 181.666666666667,213.333333333333 205,123.333333333333 230,120 255,116.666666666667 280,186.666666666667 310,190 340,193.333333333333 396.666666666667,156.666666666667 410,140 423.333333333333,123.333333333333 393.333333333333,98.3333333333333 390,90");
var gmy2 = (StreamGeometry)StreamGeometry.Parse("M180,241.25L180,241.25 230,290 300,246.66667175293 330,160");
var gmy = Geometry.Combine(gmy1, gmy2, GeometryCombineMode.Union, null);
myPath.Data = gmy;
// Add path shape to the UI.
this.panel1.Children.Add(myPath);

但结果如下:

enter image description here

如何在WPF中组合曲线? 由于项目的限制,我们必须在没有布局和xaml的情况下实现这一点。这意味着我们需要的结果类型是Geometry。

3 个答案:

答案 0 :(得分:3)

比连接路径字符串更通用:

如果您有一组任意几何图形并想要对它们进行分组,请使用GeometryGroup

Geometry gmy1 = ...;
Geometry gmy2 = ...;
var gmy = new GeometryGroup();
gmy.Children.Add(gmy1);
gmy.Children.Add(gmy2);
myPath.Data = gmy;

答案 1 :(得分:1)

易:

Path myPath = new Path();
myPath.Stroke = Brushes.Black;
myPath.StrokeThickness = 1;
var gmy1 = (StreamGeometry)StreamGeometry.Parse("M100,100C110,118.333333333333 138.333333333333,206.666666666667 160,210 181.666666666667,213.333333333333 205,123.333333333333 230,120 255,116.666666666667 280,186.666666666667 310,190 340,193.333333333333 396.666666666667,156.666666666667 410,140 423.333333333333,123.333333333333 393.333333333333,98.3333333333333 390,90");
var gmy2 = (StreamGeometry)StreamGeometry.Parse("M180,241.25L180,241.25 230,290 300,246.66667175293 330,160");

var gmy = (StreamGeometry)StreamGeometry.Parse(gmy1.ToString() + gmy2.ToString());

myPath.Data = gmy;
// Add path shape to the UI.
this.panel1.Children.Add(myPath);

路径定义语言是一种语言。将它作为一个使用。 StreamGeometry.ToString()Geometry解析回其路径定义语言表示,然后您可以将其与另一个表示合并。

请注意,这是有效的,因为每个都以M的Move命令开头:它开始一个新行。我不会认为有任何现实的情况,你会遇到任何麻烦(并且它不会让你开始{{1}对于Line而言,但理论并不是我最强的主题。

答案 2 :(得分:0)

只需将它们添加到GridCanvasCombine执行交叉组合,您似乎只想覆盖它们。或者将它们添加到GeometryGroup并将其添加到面板中。