我有一个奇怪的行为与VirtualizingStackPanel.我有一个列表,其中包含TextBlock与TextWrap =“Wrap”的项目.这是代码:
<ListBox x:Name="messagesList" ItemsSource="{Binding Messages}" > <ListBox.ItemContainerStyle> <Style TargetType="ListBoxItem"> <Setter Property="HorizontalContentAlignment" Value="Stretch" /> </Style> </ListBox.ItemContainerStyle> <ListBox.ItemTemplate> <DataTemplate> <StackPanel> <toolkit:ContextMenuService.ContextMenu> <toolkit:ContextMenu> ... </toolkit:ContextMenu> </toolkit:ContextMenuService.ContextMenu> <CheckBox Style="{Binding Own,Converter={StaticResource MsgTypeToStyle}}" Tag="{Binding TimeString}" IsEnabled="True"> <TextBlock Text="{Binding Content}" TextWrapping="Wrap"/> </CheckBox> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
它的工作相当不错,但如果我尝试滚动非常快(使用鼠标在模拟器,而不是prommatically)有一些滞后的滚动,可能HorizontallOffset有时计算错误,在底部的结尾非常奇怪的结果(见图像,右图像演示了正常行为).
经过研究,我发现这个问题在组合VirtualizingStackPanel和TextBlock.TextWrap =“Wrap”,如果我从这对夫妇中删除一个元素都可以正常工作.
但是我需要虚拟化,因为大项目数量,TextWrap正确显示文本.
所以我想自己实现虚拟化面板,你可以引导我,怎么做,还是如何解决当前的问题?
UPD:问题:
在前两个图像上,ListBox已经(!)滚动到底部(不能再向下滚动),但是元素放置不正确,正确的放置显示在右边的图像上.只有当您滚动的时候才会发生这种情况.
UPD2:感谢米兰Aggarwal.他提供了一个很好的例子我的问题here.似乎这是一个在ListBox的错误.提供的解决方法不适合我的场景,因为我需要与ListBox项目中的控件进行交互.
现在我正在尝试捕获ManipulationCompleted事件,并检查它是否是惯性的,如果这样就意味着滚动并设置焦点到页面:
void messagesList_ManipulationCompleted(object sender,ManipulationCompletedEventArgs e) { if (e.IsInertial) this.Focus(); }
附:感谢祝你好运祝福;)
解决方法
为了克服滚动上的黑色事件,您需要虚拟化滚动控件.为此,您应该继承IList并创建一个与ObservableCollection类似的集合,您可以根据缓存要求重写默认索引器,并同时维护项目的缓存.我觉得这可能是你正在寻找的:
http://blogs.msdn.com/b/ptorr/archive/2010/08/16/virtualizing-data-in-windows-phone-7-silverlight-applications.aspx
该页面上有一个示例项目.试试看.
我也觉得你正在面对这个问题http://blog.rsuter.com/?p=258.我想这将使用虚拟化本身来解决.希望它有帮助