【问题标题】:How to know when a ListBoxItem comes into view?如何知道 ListBoxItem 何时出现?
【发布时间】:2017-07-07 06:23:58
【问题描述】:

当列表框项目出现时,是否有事件告诉我?

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

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

【问题讨论】:

  • 您的 ListBox 应该有一个带有 Image 控件的 ItemTemplate。该 Image 控件的 Source 属性应绑定到视图模型项类中的属性。由于虚拟化,绑定不会被初始化,也不会在项目实际变得可见之前访问源属性,因此会创建一个 ListBoxItem 容器。关键是视图模型项在调用属性getter之前不会创建位图。

标签: c# wpf listbox


【解决方案1】:

当列表框项目出现时,是否有事件告诉我?

您可以处理ListBoxItem 容器的Loaded 事件:

<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;
    //...
}

【讨论】:

  • 只有第一次进入可见区域时才会触发。
【解决方案2】:

您可以使用SelectedItem 来获得初始选择,然后您可以为它上面和下面的几个生成位图 - 确切的数字将取决于您的位图大小和ListBox 的大小。

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

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

【讨论】:

    猜你喜欢
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多