You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF开发中Path渲染路径与设置的Segments不重合问题求助

WPF Path渲染异常问题修复

问题现象

在WPF中开发自定义Path路径时,预期绘制沿X轴负方向(向左)的水平线段,但实际渲染效果不符合预期。
运行效果截图

复现代码

XAML代码

<Window x:Class="Playground.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" Title="Test" Height="220" Width="200" Loaded="Window_Loaded">
            <Canvas Width="100" Height="100" Background="Black" Margin="50">
                <Path Stroke="Red" StrokeThickness="2" Name="myPath" />
            </Canvas>
</Window>

C#后台代码

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var _pathFigure = new PathFigure() { Segments = new PathSegmentCollection() };
    var _pathCollection = new PathFigureCollection();
    _pathCollection.Add(_pathFigure);
    myPath.Data = new PathGeometry() { Figures = _pathCollection };
    var pts = new List<Point>()
    {
        new Point(50,50),
        new Point(1,50),
        new Point(50,50),
    };
    _pathFigure.Segments.Clear();
    _pathFigure.StartPoint = pts.First();
    foreach (var p in pts)
    {
        var segment = new LineSegment();
        segment.Point = new Point(p.X, p.Y);
        _pathFigure.Segments.Add(segment);
    }
}

问题原因

代码存在两处逻辑错误:

  • PathFigure的StartPoint已经指定了路径的起始点(即pts列表的第一个点(50,50)),Segments集合内的线段会自动从StartPoint(或上一个线段的终点)开始连接。遍历全部点位添加线段时,把起始点也加入了集合,生成了一段零长度的冗余线段。
  • pts列表中额外添加了第三个点(50,50)(和起始点重合),导致路径画到左端点(1,50)后又沿原路径返回起始点,最终路径是「起点→起点→左端点→起点」的折返线段,和预期的单向向左路径不符。

修复方案

修改后台代码的点位逻辑:遍历点位时跳过第一个起始点,同时移除pts列表中多余的折返点,仅保留需要绘制的路径点位。建议先完成所有路径配置再赋值给Path.Data,减少不必要的重绘开销。
修复后的C#后台代码如下:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    var _pathFigure = new PathFigure { Segments = new PathSegmentCollection() };
    var _pathCollection = new PathFigureCollection { _pathFigure };
    
    // 仅保留路径起点、终点
    var pts = new List<Point>()
    {
        new Point(50,50),
        new Point(1,50)
    };
    _pathFigure.StartPoint = pts[0];
    // 跳过已设为StartPoint的第一个点,遍历剩余点位生成线段
    foreach (var p in pts.Skip(1))
    {
        _pathFigure.Segments.Add(new LineSegment(p, isStroked: true));
    }
    myPath.Data = new PathGeometry(_pathCollection);
}

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 23:03:30