XAML 为什么这些路径段未对齐?

35g0bw71  于 2022-12-31  发布在  其他
关注(0)|答案(1)|浏览(130)

我尝试用几个XAML Path对象(代码中声明的)创建一个由几条弧线构成的圆,问题是在绘制时,路径最终没有对齐,如下图所示(尝试绘制两条180度的弧线)。

添加的路径越多,情况就越糟,这表明未对准以某种方式累积起来。

我重新检查了几次我的计算。我也试着将x值偏移1个位置,以防错误来自重叠的路径段。也许这是渲染的一个更深层次的问题?
编号
这段代码有点粗糙,但简单地说,我从Angle = 0开始,加上45度,画一条弧到这一点,然后从上一条弧结束的地方再次重复这一过程,如第二张图所示。

double Angle = 0;
double Radius = 150; //half the width of the yellow square
Point StartPoint = new Point(150, 0);
...

Arcs = new ObservableCollection<Path>(); //used as a source for ItemsControl to bind to

while (Angle < Math.PI*2)
{
    Angle += Math.PI / 4;

    //subtracting Math.PI/2 to account for starting the first arc at x=150, y=0
    double sin = Math.Sin(Angle - Math.PI / 2); 
    double cos = Math.Cos(Angle - Math.PI / 2);

    double nX = Math.Round(cos * Radius + 150);
    double nY = Math.Round(sin * Radius + 150);
    Point endPoint = new Point(nX, nY);

    Path p = CreatePath(StartPoint, endPoint);

    StartPoint = endPoint;
    Arcs.Add(p);
}

CreatePath函数主要是XAML填充符,但在这里只是以防万一

private Path CreatePath(Point start, Point end)
{
    PathSegment ps = new ArcSegment()
    {
        Size = new Size(Radius, Radius),
        Point = end,
        SweepDirection = SweepDirection.Clockwise
    };

    PathFigure pf = new()
    {
        StartPoint = start,
        IsClosed = false,
        IsFilled = false,
        Segments = new PathSegmentCollection() { ps }
    };

    Geometry g = new PathGeometry()
    {
        Figures = new PathFigureCollection() { pf }
    };

    Path p = new()
    {
        Data = g,
        Stroke = new SolidColorBrush(Colors.Black),
        StrokeThickness = 3
    };

    return p;
}

还有更好的方法来完成我想做的事情吗?

9o685dep

9o685dep1#

问题是在创建多个Path对象时,每个对象都会推动其相邻对象,从而导致轻微但累积的未对齐。我认为有两种解决方案:
1.重构代码,将所有内容都保存在一个父Path对象中,我没有选择这个方法,因为我想在每个Path段上使用不同的Property animations
1.我选择了更多的hacky解决方案。在创建每个Path对象时,添加一个额外的属性,

Path p = new()
{
    Data = g,
    Stroke = new SolidColorBrush(Colors.Black),
    StrokeThickness = 3,
    Margin = new Thickness(-1) //<--- somehow corrects for the misalignment
};

相关问题