我的问题很简单。
我该如何转换此代码:
<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曲线的精确点来生成正确的代码以获得椭圆,但我不想去自己做这个计算的麻烦,所以我想知道是否有一个简单的方法来做这个(在混合中)或者
答案 0 :(得分:8)
这显示了如何从代码中执行此操作。我不确定这是否会解决你的问题 - 你说“混合?”在标题中,我不知道在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,1709086100067683 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
是一种更有效的表示形式,因为它最终会创建更少的对象。但是我的代码到达该表示的路径效率不高,所以你可能最好只停留{{1}第一个代码片段产生的。或者,如果您的目标只是获取路径文本,那么PathGeometry
也足以满足您的需求。)