获取在XAML画布上绘制的路径的宽度

时间:2015-05-29 15:30:47

标签: xaml canvas windows-phone-8.1

我以编程方式绘制画布,给出了来自其他地方的一堆路径数据并将其添加到画布中

// This is actually done more elaborately, but will do for now
PathFigureCollection figures = GetPathFigureCollection();

var path = new Path
{
    Data = new PathGeometry { Figures = figures },
    Fill = GetFill(),
    Stroke = GetStroke(),
    StrokeThickness = GetThickness()
};
MyCanvas.Children.Add(path);

现在,我在ScrollViewer中有画布,所以我想确保我可以一直滚动以显示整个路径(实际路径 s - 我有几个,以相同的方式生成)但没有进一步。我试过这个:

var drawingWidth = MyCanvas.Children
                       .OfType<FrameworkElement>()
                       .Max(e => Canvas.GetLeft(e) + e.ActualWidth);
MyCanvas.Width = drawingWidth;

这适用于其他一些元素(图形也有一些文本块和省略号),但对于Canvas.GetLeft(e)e.ActualWith的路径(以及我尝试的其他一些内容{ {1}}和e.RenderSize.Width)都返回e.DesiredSize.With。由于向右延伸最远的元素是路径,因此画布太小。

如何获得0元素的宽度?

1 个答案:

答案 0 :(得分:0)

哈,发现它!

将LINQ查询重写为循环,我可以将路径转换为Path,并使用path.Data.Bounds.Right作为该元素的右边缘。**我可能能够将代码转换回LINQ查询现在我知道我想要做什么(我总是发现它们比有状态循环更具可读性......)。

当我仔细阅读markE提供的链接后,我发现了这一点,作为附注,其中说明了

  

如果您的设计要求允许更粗略的近似值,那么您会发现立方贝塞尔曲线始终包含在其控制点内。

所以,如果我能找到路径中所有路径图中最右边的控制点,我就会回家。 Intellisense为我完成了剩下的工作:)