2013-06-19 14 views
0

我需要迭代ListBox控件的VirtualizingStackPanel才能獲得ListBoxItem.RenderSize值。在VB.NET代碼的C#中,這怎麼可能完成?訪問Items列表框中的Presenter項目

背景:

我在WPF第三方控件庫,這顯然有缺陷(或「特徵」)與它的措施()算法的工作。相反,它會執行非標準的附屬依賴屬性來調整其中一個框架的大小。

爲了解決這個問題,我重寫了度量並將自己的值提供給附加屬性,但值正被視覺樹中的干預值所佔用。但是,我的ListBox的Items屬性返回viewmodels,它不包含大小信息。視圖模型的模板也不能自動調整大小。

+0

您可以通過調用[ContainerFromItem](http://msdn.microsoft.com/en-us/library/system.windows.controls.itemcontainergenerator.containerfromitem.aspx)來訪問項目的容器(即ListBoxItem) )ListBox的[ItemContainerGenerator]方法(http://msdn.microsoft.com/en-us/library/system.windows.controls.itemscontrol.itemcontainergenerator.aspx) – Clemens

+0

在ListBox.Items的ViewModel上調用該函數'收集返回'沒什麼' –

+0

那麼,你不知怎的做錯了。 'ContainerFromItem'將爲您提供包含項目的'ListBoxItem',前提是該項目包含在ListBox的Items集合中,並且相應的ListBoxItem已經創建。可能由於虛擬化,ListBoxItem尚未創建。 – Clemens

回答

0

如果未創建容器(即,它在視口範圍外),則必須獲取作爲ListBox模板子項的ScrollViewer,然後調用ScrollToHorisontalOffset方法爲項目創建容器。之後,您還應該調用UpdateLayout來強制容器生成 - 在這裏您可以訪問新創建的容器。請注意,在RenderSize中沒有正確的值,但可以測量元素並獲取其DesiredSize。

請注意,如果您的列表框已摺疊或容器生成未啓動(或未完成),則ContainerFromItem可以返回null - 檢查ItemContainerGenerator.Status屬性。

+0

代碼示例會讓我理解這個答案很長的路要走。我懷疑我正在嘗試在生成列表框視覺元素之前執行這些度量。 –

相關問題