2009-06-11 9 views
1

Ich sehe den seltsamsten Fehler mit dem folgenden Code.WPF Bug oder werde ich verrückt?

Ich habe ein PathGeometry zu dem ich eine PathFigure hinzugefügt, so dass ich LineSegment s ihm hinzufügen.

Das ist, was ich tue:

_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); 

ich es dann ziehen:

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

Was muss ich sehen:

WPF eine vertikale Linie ziehen sollten das geht von 0 bis -10 und zurück auf 0. Der letzte Teil (bac k bis 0) kann nicht gesehen werden, da es auf demselben x Pixel gezeichnet wird. Aber der letzte Teil führt die folgende:

Was ich sehe:

WPF zeichnet eine Linie, die von 0 bis -15 geht. Es ergibt keinen Sinn für mich. Diese 5-Pixel-Differenz tritt auf, wenn ich eine vertikale Linie über eine andere vertikale Linie wie im vorherigen Beispiel zeichne.

Bitte jemand sagen mir, dass ich einen Fehler gemacht habe und dies ist kein WPF-Fehler.

+0

Was sehen Sie, wenn Sie auch den x-Wert ändern? – ChrisF

+0

Es ist egal, weil es auf dem gleichen x-Wert sein muss. Der Grund dafür ist eine sich ändernde Linie, bei der ich nicht weiß, wo die Linie enden wird. –

+0

Btw, es zeichnet richtig, wenn ich den x-Wert ändern. Es ist nur so, dass ich an diesem Punkt auf demselben Pixel bin. –

Antwort

5

Ich denke, das Problem hat damit zu tun, wie WPF "Ecken" in Ihrem Pfad rendert. Wenn der Winkel zwischen zwei Liniensegmenten spitzer wird, wird das Ecken-Rendering deutlicher.

In Ihrem Fall haben Sie einen Null-Grad-Winkel (ein Liniensegment, das auf sich selbst zurückfaltet), was der problematischste Fall ist.

nicht alles verloren - es mehrere mögliche Lösungen:

  • Split die PathFigure in zwei PathFigures (die Ihre Abhilfe ist). Dadurch entfernen Sie die Ecke und damit das Problem.
  • Legen Sie die StrokeLineJoin-Eigenschaft des Pfads auf Bevel anstelle der Mitre (Standardeinstellung) fest. Dadurch wird die Eckenerscheinung abgeschrägt.
  • Senken Sie den StrokeMiterLimit des Pfads. Dies wird die Ecke weniger "spitz" machen, wie die Wissenschaftler sagen.
  • Sagen Sie dem LineSegment, dass es seine "Ecken-Nichtigkeit" explizit entfernen soll.Sie können dies tun, indem Sie die IsSmoothJoin-Eigenschaft auf true festlegen.

Weitere Informationen zu StrokeLineJoin finden Sie unter here. Für einen interessanten Beitrag darüber, wie WPF gekerbte Ecken macht, siehe here.

+0

Ich bin in Ordnung mit meiner Problemumgehung. Danke für alle Lösungen. Sehr interessant zu erfahren, warum dies passiert und wie man es umgehen kann. –

0

Wenn es ähnlich wie GraphicsPath ist, müssen Sie auch den Endpunkt festlegen.

+0

Das letzte LineSegment ist immer der Endpunkt. –

0

Ok, ich habe selbst eine Lösung für dieses Problem gefunden. Es scheint ein WPF-Bug zu sein.

Sie müssen die LineSegment s auf einzelne PathFigure s hinzufügen nicht dieses seltsame Verhalten sehen:

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); 

ich immer noch dankbar wäre, wenn jemand erklären könnte, warum ich diesen Fehler sehen, ob ich es nicht tun Auf diese Weise oder wenn jemand bestätigen könnte, dass dies ein Fehler ist.