我正在寻找一种在 xaml 中为 StreamGeometry 创建非描边区域的方法。
换句话说,我想知道是否可以使用 StreamGeometry Xaml 标记语法重新创建以下代码(取自 msdn)。
StreamGeometry geometry = new StreamGeometry();
geometry.FillRule = FillRule.EvenOdd;
using (StreamGeometryContext ctx = geometry.Open())
{
ctx.BeginFigure(new Point(10, 100), true /* is filled */, true /* is closed */);
ctx.LineTo(new Point(100, 100), false/* is not stroked */, false /* is smooth join */);
ctx.LineTo(new Point(100, 50), true /* is stroked */, false /* is smooth join */);
}
我正在寻找适用于 WPF 的解决方案,因为 Silverlight 没有 StreamGeometry。
最佳答案
这是使用 PathGeometry 的直接翻译:
<PathGeometry FillRule="EvenOdd">
<PathFigure StartPoint="10,100" IsFilled="true" IsClosed="true">
<LineSegment Point="100,100" IsStroked="false" IsSmoothJoin="false" />
<LineSegment Point="100,50" IsStroked="true" IsSmoothJoin="false" />
</PathFigure>
</PathGeometry>
这可以通过省略 FillRule、IsFilled、IsStroked 和 IsSmoothJoin 的默认值来简化,结果如下:
<PathGeometry>
<PathFigure StartPoint="10,100" IsClosed="true">
<LineSegment Point="100,100" IsStroked="false" />
<LineSegment Point="100,50" />
</PathFigure>
</PathGeometry>
这必须使用 PathGeometry 来完成,而不是使用几何迷你语言(例如“M10,100 L100,100 100,50”),因为迷你语言无法设置 IsStroked=false。
由于您需要 StreamGeometry,我建议您使用 this answer 中的 GeometryExtensions.DrawGeometry
方法将 XAML 中定义的 PathGeometry 转换为 StreamGeometry。
我倾向于使用标记扩展来做到这一点:
<local:ConvertToStreamGeometry>
<PathGeometry>
<PathFigure StartPoint="10,100" IsClosed="true">
<LineSegment Point="100,100" IsStroked="false" />
<LineSegment Point="100,50" />
</PathFigure>
</PathGeometry>
</local:ConvertToStreamGeometry>
标记扩展的实现很简单:
[ContentProperty("Geometry")]
public class ConvertToStreamGeometry : MarkupExtension
{
public Geometry Geometry { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var result = new StreamGeometry();
using(var ctx = result.Open())
ctx.DrawGeometry(Geometry);
return result;
}
}
请注意,这会从 my earlier answer 中的代码调用 GeometryExtensions.DrawGeometry 扩展方法.
关于c# - 在 C# StreamGeometry Xaml 标记中创建非描边区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3135515/