1

次のコードで最も奇妙なバグが見られます。

sを追加できるように、 を追加PathGeometryしたがあります。PathFigureLineSegment

これが私がすることです:

_pathGeometry.Figures.Add(_pathFigure);
_pathFigure.StartPoint = new Point(4, 0);
LineSegment lineSegment1 = new LineSegment(new Point(4, -10), true);
LineSegment lineSegment2 = new LineSegment(new Point(4, 0), true);
_pathFigure.Segments.Add(lineSegment1);
_pathFigure.Segments.Add(lineSegment2);

それから私はそれを描きます:

using (DrawingContext drawingContext = RenderOpen())
   drawingContext.DrawGeometry(null, _pen, _pathGeometry);

私が見るべきもの:

WPF は、0 から -10 まで移動して 0 に戻る垂直線を描画する必要があります。最後の部分 (0 に戻る) は、同じ x ピクセルに描画されているため表示できません。しかし、最後の部分は次の原因になります。

私が見るもの:

WPF は 0 から -15 までの線を描画します。私には意味がありません。この 5 ピクセルの違いは、前の例のように別の垂直線の上に垂直線を描画するたびに発生します。

これは WPF のバグではありません。

4

3 に答える 3

5

この問題は、WPF がパスの「コーナー」をレンダリングする方法に関係していると思います。2 つの線分の間の角度が鋭角になるにつれて、角のレンダリングがより明確になります。

あなたの場合、角度が 0 度 (線分が折り返されている) であり、これが最も問題のあるケースです。

すべてが失われるわけではありません。いくつかの可能な解決策があります。

  • PathFigure を 2 つの PathFigures に分割します (これが回避策です)。これを行うことで、角が取り除かれ、したがって問題が解消されます。
  • Path の StrokeLineJoin プロパティを Miter (デフォルト) ではなく Bevel に設定します。これにより、コーナーの外観が面取りされます。
  • パスの StrokeMiterLimit を下げます。これにより、科学者が言うように、コーナーの「尖り」が少なくなります。
  • LineSegment に「コーナーネス」を明示的に削除するように指示します。これを行うには、IsSmoothJoin プロパティを true に設定します。

StrokeLineJoin の詳細については、こちらを参照してください。WPF が留め継ぎコーナーをレンダリングする方法に関する興味深い投稿については、こちらを参照してください。

于 2009-06-11T20:42:19.260 に答える
0

わかりました、私はこの問題の解決策を自分で見つけました。それは WPF のバグのようです

この奇妙な動作が見られないようにするには、LineSegment個々の にを追加する必要があります。PathFigure

PathFigure pathFigure1 = new PathFigure();
pathFigure1.StartPoint = new Point(4, 0);
LineSegment lineSegment1 = new LineSegment(new Point(4, -10), true);
pathFigure1.Segments.Add(lineSegment1);

PathFigure pathFigure2 = new PathFigure();
pathFigure2.StartPoint = new Point(4, -10);
LineSegment lineSegment2 = new LineSegment(new Point(4, 0), true);
pathFigure2.Segments.Add(lineSegment2);

pathGeometry.Figures.Add(pathFigure1);
pathGeometry.Figures.Add(pathFigure2);

私がこのようにしない場合、または誰かがこれがバグであることを確認できる場合、誰かがこのバグが表示される理由を説明できれば、私はまだ感謝しています.

于 2009-06-11T14:15:09.640 に答える
0

のような場合はGraphicsPath、終点も設定する必要があります。

于 2009-06-11T12:35:48.693 に答える