我有一个奇怪的行为VirtualizingStackPanel
。我有一个包含TextBlock
with的项目列表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>
它工作得很好,但是如果我尝试非常快地滚动(在模拟器上使用鼠标,而不是使用鼠标)滚动会有一些滞后,HorizontallOffset
有时可能计算错误,并且在底部以非常奇怪的结果结束(见图,右图演示正常行为)。
经过研究,我发现了这个问题VirtualizingStackPanel
,TextBlock.TextWrap="Wrap"
如果我从这对夫妇中删除一个元素,所有的工作都正常。
但是我需要虚拟化,因为项目数量很大,并且TextWrap
要正确显示文本。
所以我想自己实现虚拟化面板,请你指导我,如何做到这一点,或者如何解决当前的问题?
UPD:问题:
前两个图像ListBox
已经(!)滚动到底部(不能再向下滚动),但元素放置不正确,正确放置显示在右侧图像上。仅当您滚动非常快时才会发生这种情况。
UPD2:感谢米兰阿加瓦尔。他在这里为我的问题提供了一个很好的案例。看来这确实是ListBox
. 提供的解决方法不适合我的场景,因为我需要与ListBox
item 内部的控件进行交互。现在我正在尝试捕获ManipulationCompleted
事件并检查它是否是Inertial
,如果是,则意味着滚动,我将焦点设置为页面:
void messagesList_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
if (e.IsInertial)
this.Focus();
}
PS感谢祝你好运;)