c# - 在 C# StreamGeometry Xaml 标记中创建非描边区域

标签 c# .net wpf xaml geometry

我正在寻找一种在 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/

相关文章:

.net - ASP.NET Web API 在单个服务中自托管 HTTPS 和 HTTP?

.net - FtpWebResponse 无法为 Ubuntu 服务器上的特定目录名称的 WebRequestMethods.Ftp.MakeDirectory 方法创建目录

.net - NETCore1.1中如何设置AssemblyTitleAttribute

wpf - 具有最小化动画的自定义窗口样式

c# - 使用内联对象初始化器与将变量 1 传递给 EF Select 之间的细微差别

c# - Windows 窗体计算 C#

c# - 初学者 - C# 遍历目录以生成文件列表

wpf - 在其他控件旁边显示 itemtemplate 中的用户控件列表

WPF 分隔符位置

c# - 程序类型已经存在:com.android.installreferrer.api.InstallReferrerClient $ 1