我的问题很简单。

如何转换此代码:

<Path>
    <Path.Data>
        <EllipseGeometry Center="5,4" RadiusX="4" RadiusY="4"/>
    </Path.Data>
</Path>


变成像

<Path Data="M 0 5 L 3 10 10 0"/>


(请注意,第二个产生一个复选标记,而不是一个椭圆。这只是出于说明的目的,我的目标是:找到赋予椭圆的序列)

编辑:我还阅读了有关xaml中Bezier曲线的文档,并且充分意识到,我可以通过计算Bezier曲线的精确点来获取椭圆来简单地生成正确的代码,但是我不希望这样做很麻烦我自己进行了此计算,所以我想知道是否有一种简便的方法(也许在Blend中)

最佳答案

这显示了如何从代码中做到这一点。我不确定这能否解决您的问题-您说“ with blend?”在标题中,我不知道在Blend中可以做到这一点。但我希望这可以有所帮助。

第一步是将EllipseGeometry转换为PathGeometry

var geom = new EllipseGeometry(new Point(5, 4), 4, 4);
var pathGeometry = PathGeometry.CreateFromGeometry(geom);


一旦有了PathGeometry,您可以简单地调用ToString,它将为您提供字符串表示形式:

string pathText = pathGeometry.ToString();


在我的系统上,这将产生以下相当冗长的文本:

“ M9,4C9,6.20913899932317 7.20913899932317,8 5,8 2.79086100067683,8 1,6.20913899932317 1,4 1,1.79086100067683 2.79086100067683,0 5,0 7.20913899932317,0 9,1.79086100067683 9,4z”

现在,如果您要获得将字符串输入Xaml的确切结果,则需要再执行一步,因为Xaml具有以下形式:

<Path Data="M 0 5 L 3 10 10 0"/>


不会产生PathGeometry。它产生一个StreamGeometry,它效率更高,但路径的表示形式是固定的。 (主要区别在于,您无法持有StreamGeometry中代表各种图形和外观的单个对象,而您可以使用PathGeometry。因此,StreamGeometry便宜一些。)

您可以从路径文本中获取StreamGeometry

var streamGeometry = StreamGeometry.Parse(pathText);


然后,如果您想在Path中构建它,则:

var p = new Path { Data = streamGeometry };


根据您的确切目标,可能会有更有效的方法来执行此操作。 (StreamGeometry是一种更有效的表示形式,因为它最终创建的对象要少得多。但是我的代码到达该表示形式的途径不是很有效,因此您最好停止使用PathGeometry另外,如果您的目标实际上只是获取路径文本,那么PathGeometry也足以满足您的需求。)

08-07 11:54