我以编程方式绘制画布,给出了来自其他地方的一堆路径数据并将其添加到画布中
// 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
元素的宽度?
答案 0 :(得分:0)
将LINQ查询重写为循环,我可以将路径转换为Path
,并使用path.Data.Bounds.Right
作为该元素的右边缘。**我可能能够将代码转换回LINQ查询现在我知道我想要做什么(我总是发现它们比有状态循环更具可读性......)。
当我仔细阅读markE提供的链接后,我发现了这一点,作为附注,其中说明了
如果您的设计要求允许更粗略的近似值,那么您会发现立方贝塞尔曲线始终包含在其控制点内。
所以,如果我能找到路径中所有路径图中最右边的控制点,我就会回家。 Intellisense为我完成了剩下的工作:)