在列表框中访问ItemsPresenter项

本文关键字:ItemsPresenter 访问 列表 | 更新日期: 2023-09-27 18:19:17

我需要通过ListBox控件的VirtualizingStackPanel进行迭代以获得ListBoxItem.RenderSize值。在c#和VB中。NET代码,如何做到这一点?

背景:

我正在使用WPF中的第三方控制库,该库显然有与其Measure()算法相关的错误(或"特性")。相反,它使用一个非常非标准的附加依赖属性来调整其中一个帧的大小。

为了解决这个问题,我重写了Measure并为附加的属性提供了我自己的值,但是这些值正在被视觉树中的干预值所吞噬。但是,ListBox的Items属性返回的视图模型不包含大小信息。视图模型的模板也不能,它必须自动调整大小。

在列表框中访问ItemsPresenter项

如果容器没有创建(即,它超出了viewport边界),你必须获得ScrollViewer,这是ListBox模板子,然后调用ScrollToHorisontalOffset方法来为项目创建容器。之后,您还应该调用UpdateLayout来强制容器生成—在这里您可以访问新创建的容器。请注意,in没有正确的RenderSize值,但你可以测量元素并获得它的DesiredSize。

注意,ContainerFromItem可以返回null,如果你的列表框被折叠或容器生成没有开始(或没有完成)-检查ItemContainerGenerator。状态属性。