WPF のバグですか、それとも私がおかしくなっているのでしょうか?
質問
次のコードで最も奇妙なバグが発生しています。
私は持っています PathGeometry
これに私が追加したのは PathFigure
追加できるように LineSegment
それには。
これが私がすることです:
_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 のバグではないことを教えてください。
解決
この問題は、WPF がパス内の「コーナー」をレンダリングする方法に関係していると思います。2 つの線分の間の角度が鋭くなるにつれて、コーナーのレンダリングがより明白になります。
あなたの場合、角度が 0 度 (線分が折り返される) ですが、これが最も問題のあるケースです。
すべてが失われるわけではありません。考えられる解決策はいくつかあります。
- PathFigure を 2 つの PathFigure に分割します (これが回避策です)。こうすることで角がなくなり、問題が解消されます。
- パスの StrokeLineJoin プロパティを Miter (デフォルト) ではなく Bevel に設定します。これにより、ベベルコーナーの外観になります。
- パスの StrokeMiterLimit を下げます。これにより、科学者が言うように、コーナーの「とがり」が少なくなります。
- LineSegment に「コーナーらしさ」を明示的に削除するように指示します。これを行うには、IsSmoothJoin プロパティを true に設定します。
StrokeLineJoin の詳細については、「 ここ. 。WPF が留め継ぎコーナーをレンダリングする方法に関する興味深い投稿については、次を参照してください。 ここ.
他のヒント
それが次のようなものであれば GraphicsPath
, 、終了点も設定する必要があります。
わかりました、この問題の解決策を自分で見つけました。 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);
この方法をとらないのになぜこのバグが発生するのかを誰かが説明してくれたり、誰かがこれがバグであることを確認できたりすると、やはり感謝します。