2017-07-07 20 views
0

是否有一個事件告訴我何時可以看到列表框項目?如何知道ListBoxItem何時進入視圖?

我的問題是,我可以有幾千個元素,我設置爲我的ListBox.ItemSource。每個元素都會生成一個位圖(這需要一段時間),所以如果我只是將這個位圖生成放入構造函數中,創建該集合將需要永遠創建。相反,我想推遲當一個項目進入視圖時的位圖生成。

有沒有辦法做到這一點?理想情況下,我寧願不循環所有項目,並檢查它們是否可見。

+0

你的列表框應該有一個ItemTemplate與圖像控制。該圖像控件的Source屬性應綁定到視圖模型項目類中的屬性。由於虛擬化,在項目實際上即將變爲可見之前,綁定將不會被初始化並訪問源屬性,因此會創建一個ListBoxItem容器。重點是視圖模型項目在調用屬性getter之前不會創建位圖。 – Clemens

回答

1

是否有一個事件告訴我何時可以看到列表框項目?

你可以處理Loaded事件ListBoxItem容器:

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <EventSetter Event="Loaded" Handler="OnItemLoaded" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

private void OnItemLoaded(object sender, RoutedEventArgs e) 
{ 
    ListBoxItem lbi = sender as ListBoxItem; 
    object dataItem = lbi.DataContext; 
    //... 
} 
+1

這正是我需要的,謝謝! – Philipp

0

你可以使用SelectedItem獲取初始選擇,然後你可以它上面和下面您生成位圖的少數 - 確切數目將取決於你的位圖的大小和ListBox的大小。

我建議你生成一個比你能看到的範圍稍大的範圍,所以當你在你的列表中向上/向下平移時,你不會一直在等待,同時呈現新的位圖;想想谷歌地圖 - 如果你平移一小段距離,圖像就已經存在,而且只有當你平移一個更大的距離時,你必須等待它重畫。

當您向上/向下移動列表時,您可以使用IsMouseOver來查找當前徘徊的項目,然後相應地更新渲染的位圖,再次略微超出您所能看到的位置。

相關問題