为什么添加的贝塞尔曲线不在 canvas 上呈现?

Why does added bezier not render on canvas?

我正在尝试以编程方式将贝塞尔曲线路径添加到 WPF window 中的 canvas。如果我在 XAML 中写出它们,这很好用,但是以编程方式添加一个失败

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>

代码隐藏

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

由于正确添加了黑色矩形,因此必须建立贝塞尔曲线路径,但我无法弄清楚问题出在哪里。没有错误或异常。它只是没有出现在重新渲染中。

为了完整起见,这里的贝塞尔曲线(目前已注释掉)XAML 有效

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

问题已解决

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

应该是

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