如何知道ListBoxItem何时进入视图?

时间:2017-07-07 06:23:59

标签: c# wpf listbox

是否有一个事件告诉我列表框项何时进入视图?

我遇到的问题是我可以将几千个元素设置为ListBox.ItemSource。每个元素都会生成一个位图(需要一段时间),所以如果我只是将这个位图生成放在构造函数中,那么创建集合将需要永远创建。相反,我希望在项目进入视图时推迟生成位图。

有办法做到这一点吗?理想情况下,我不想遍历所有项目并检查它们是否可见。

2 个答案:

答案 0 :(得分: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 :(得分:0)

您可以使用SelectedItem获取初始选择,然后您可以为其上方和下方的少数位置生成位图 - 具体数字取决于位图的大小和{{1的大小}}。

我建议你生成一个比你看到的范围稍大的范围,所以当你向上/向下平移列表时,你不会在渲染新的位图时一直等待;想想谷歌地图 - 如果你平移了很短的距离,那么图像已经存在,只有当你平移更大的距离时,你必须等待它重绘。

当您向上/向下平移列表时,您可以使用IsMouseOver查找当前悬停的项目,然后相应地更新渲染的位图,再次比您看到的更多。