2017-03-22 4 views
0

Ich versuche programmatisch Bézier-Pfade zu einem Canvas in einem WPF-Fenster hinzuzufügen. Dies funktioniert gut, wenn ich sie in XAML schreiben, aber nicht programmatisch eine ZugabeWarum wird Bezier nicht auf Leinwand gerendert?

XAML

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="320" Width="480" ContentRendered="Window_ContentRendered"> 

    <Canvas Margin="10" Name="canvas"> 
     <Rectangle Width="50" Height="100" Fill="LightSalmon" Margin="0,50"></Rectangle> 
    </Canvas> 
</Window> 

-Code hinter

private void Window_ContentRendered(object sender, EventArgs e) 
    { 
     var r = new Rectangle(); 

     r.Width = 50; 
     r.Height = 50; 
     r.StrokeThickness = 3; 
     r.Fill = new SolidColorBrush(Colors.Black); 

     canvas.Children.Add(r); 

     //bezier is a System.Windows.Shapes.Path 
     bezier.Stroke = new SolidColorBrush(Colors.Black); 
     bezier.StrokeThickness = 35; 

     PathFigure pf = new PathFigure { StartPoint = new Point(50, 67.5) }; 
     PolyBezierSegment pbs = new PolyBezierSegment(new Point[] { new Point(100, 67.5), new Point(100, 50), new Point(150, 50) }, false); 
     pf.Segments.Add(pbs); 

     PathFigureCollection pfc = new PathFigureCollection { pf }; 

     PathGeometry pg = new PathGeometry(); 
     pg.Figures = pfc; 

     bezier.Data = pg; 

     canvas.Children.Add(bezier); 

     canvas.Dispatcher.Invoke(() => { }, DispatcherPriority.Render); 
    } 

Da das schwarze Rechteck korrekt hinzugefügt wird es etwas mit Gebäude sein muss den Bezier-Pfad hinauf, aber ich kann nicht herausfinden, wo das Problem liegt. Es gibt keine Fehler oder Ausnahmen. Beim Rendern wird es einfach nicht angezeigt.

Für Vollständigkeit, hier die (derzeit auf Kommentar) XAML des Bezier, Werke, die

<Path Stroke="Black" StrokeThickness="30" Name="blackPath"> 
     <Path.Data> 
      <PathGeometry> 
       <PathFigureCollection> 
        <PathFigure StartPoint="50,67.5"> 
         <PolyBezierSegment Points="100,67.5 100,50 150,50" /> 
        </PathFigure> 
       </PathFigureCollection> 
      </PathGeometry> 
     </Path.Data> 
    </Path> 

Antwort

1

Problem

gelöst
PolyBezierSegment pbs = new PolyBezierSegment(
    new Point[] { new Point(100, 67.5), 
    new Point(100, 50), 
    new Point(150, 50) }, 
    false); // <== Wrong 

sollte

PolyBezierSegment pbs = new PolyBezierSegment(
    new Point[] { new Point(100, 67.5), 
    new Point(100, 50), 
    new Point(150, 50) }, 
    true); // <== Set to true if the Stroke is defined separately, which is the case for me