【问题标题】:Adding an ArcSegment on a WPF Canvas在 WPF 画布上添加 ArcSegment
【发布时间】:2014-10-20 16:26:52
【问题描述】:

我正在尝试向 WPF 画布添加一个圆角矩形。我阅读了几种使用矩形的帖子方法,但它们通常是添加 UI 元素,例如使用 LineGeometry,而不是 WPF 画布上的对象。

有人可以帮助我如何处理 ArcSegment 类以将其添加到画布中,就像我添加线条一样?

例如在使用线条时:

首先我定义行参数

Line botLine = new Line();
botLine.X1 = x + width - radius;
botLine.Y1 = y;
botLine.X2 = x + radius;
botLine.Y2 = y;

然后我可以像这样将线添加到画布:

canvas1.Children.Add(botLine);

但我无法使用相同的方法添加 ArcSegment。在这种情况下会采用什么方法?还有一种方法可以将直线和弧连接到一个实体中吗?

【问题讨论】:

  • 你知道有一个 Rectangle 类,它的角半径具有 RadiusX 和 RadiusY 属性吗?
  • @Clemens 是的,我知道,但是半径是固定的,我无法正确锚定矩形(或者我找不到锚定它的方法)。
  • 您将设置附加属性Canvas.LeftCanvas.Top
  • @Clemens 在您发表评论后,我阅读了它,但是对于我想要的,最好有一个自定义路径/几何/图形,我可以使用公式或其他对象引用作为锚点。感谢您的 cmets,它们很有用,但我发现下面提出的解决方案正是我所需要的。

标签: c# wpf debugging canvas


【解决方案1】:

您不能将ArcSegment 添加到Canvas,因为它不是Shape;它是几何 API 的一部分,表示基于路径的几何图形中的弧线,但它不是您通常会直接使用的类。

没有直接对应于“弧”的Shape,但您可以为它的几何创建一个带有单个弧的Path。在 C# 中执行此操作的最简单方法是使用 StreamingGeometry 作为路径数据:

var g = new StreamGeometry();

using (var gc = g.Open())
{
    gc.BeginFigure(
        startPoint: new Point(0, 0), 
        isFilled: false, 
        isClosed: false);

    gc.ArcTo(
        point: new Point(100, 100),
        size: new Size(100, 100),
        rotationAngle: 0d,
        isLargeArc: false,
        sweepDirection: SweepDirection.Clockwise,
        isStroked: true,
        isSmoothJoin: false);
}

var path = new Path
           {
               Stroke = Brushes.Black,
               StrokeThickness = 2,
               Data = g
           };

canvas1.Children.Add(path);

根据需要调整参数以适合您的用例。要了解如何在 XAML 中声明路径几何,请参阅 this MSDN article 了解 WPF 的路径标记语法。

【讨论】:

  • 没问题!请注意,我建议您阅读 isLargeArcsweepDirection 等参数,因为您可能需要根据圆弧的大小和方向更改这些值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多