我的问题很简单。
如何转换此代码:
<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
也足以满足您的需求。)