【问题标题】:ListBox OnSelectionChanged event stops working with "many" itemsListBox OnSelectionChanged 事件停止处理“许多”项目
【发布时间】:2011-01-17 01:18:46
【问题描述】:

我注意到一个非常奇怪的行为: 在我的 windows phone 7 中,我有一个 ListBox,可以包含从 1-2 到 2-300 项的任何内容。 我注意到当项目数量很大时(不确定数量,但肯定 > 150 个项目),不会引发 OnSelectionChanged 事件。

这是我的列表框的 XAML

<ListBox ItemsSource="{Binding Path=Posts}" ItemTemplate="{StaticResource IconsWithText}"
        ScrollViewer.VerticalScrollBarVisibility ="Disabled"
        SelectionChanged="ListBox_SelectionChanged" >
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel Orientation="Horizontal" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

ItemTemplate 的模板是:

<DataTemplate x:Name="IconsWithText">
    <Grid x:Name="ThumLink"  Width="160" Height="140" Margin="10" Background="#FF666666">
        <Image Source="Resources/Images/All.png" Visibility="{Binding Path=VisibilityAll}" />
        <Image delay:LowProfileImageLoader.UriSource="{Binding Picture}"
                Visibility="{Binding Path=VisibilityPic}"
                Stretch="UniformToFill" VerticalAlignment="Top" HorizontalAlignment="Left" />
        <Border x:Name="border" VerticalAlignment="Bottom" Background="#d9ffffff" Height="62" BorderBrush="Black" Visibility="{Binding Path=VisibilityPic}"  >
            <TextBlock x:Name="textBlock" Text="{Binding Title}" VerticalAlignment="Top" TextWrapping="Wrap" MaxHeight="60" Style="{StaticResource PhoneTextSmallStyle}"
                Foreground="Black" FontSize="20" Margin="4,1,4,0" Height="62"/>
        </Border>
    </Grid>
</DataTemplate>

这是一个错误还是我做错了什么?我在调试中,事件处理程序永远不会被调用,但是当项目不多时它可以工作。

西蒙娜

【问题讨论】:

  • 您可能想向我们展示ListBox xaml。例如,您是否会在其ItemPanelTemplate 中提供StackPanel,因为这样会因太多项目而失败。
  • 添加了代码...是的,使用 StackPanel...为什么会失败?漏洞?有什么解决方法吗?
  • 使用虚拟化堆栈面板会更好吗?
  • 能否也提供您正在使用的项目模板? (顺便说一句,在你的回答评论之前加上@anthonywjones:SO 通知系统理解这个约定)。
  • 如果从项目模板中取出两个图像会发生什么,它仍然会失败吗?如果不添加“全部”图像,那仍然会失败吗?如果不删除“全部”图像并恢复另一个图像,它现在会失败吗?

标签: windows-phone-7 listbox


【解决方案1】:

使用普通的StackPanel 的问题是所有视觉对象都将被创建并添加到StackPanel,这在内存方面非常昂贵,并且可能会超出渲染系统中的其他限制。

尝试更改为:-

<VirtualisingStackPanel Orientation="Horizontal" />

到目前为止,即使使用普通的 StackPanel,我也无法用 300 个项目重现您的问题。

【讨论】:

  • 还必须在 ListBox 中添加 VirtualizingStackPanel.VirtualizationMode="Recycling" 以使其适用于我的一长串对象(现在它增加到 400 多个项目)
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-16
  • 2023-02-07
  • 1970-01-01
相关资源
最近更新 更多