У меня странное поведение с 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>
Он работает очень хорошо, но если я попытаюсь прокрутить очень быстро (используя мышь на эмуляторе, а не промативно), есть некоторое отставание в прокрутке, возможно, HorizontallOffset
иногда вычисляет неправильно, а внизу в конце с очень странным результатом (см. изображение, правое изображение демонстрирует нормальное поведение).
После исследования я выяснил, что проблема в комбинации VirtualizingStackPanel
и TextBlock.TextWrap="Wrap"
, если я удалю один элемент из этой пары, все работает правильно.
Но мне нужна виртуализация из-за большого количества элементов и TextWrap
для правильного отображения текста.
Итак, я думаю о том, чтобы сделать мою собственную реализацию Virtualization Panel, можете ли вы, пожалуйста, направить меня, как это сделать или как исправить текущую проблему?
UPD: проблема:
на первых двух изображениях ListBox
уже (!) прокручивается снизу (его больше нельзя прокручивать), но элементы помещены неправильно, правильное размещение показано на нужном изображении. Это происходит, только если вы прокрутите очень быстро.
UPD2: благодаря Милану Аггарвалю. Он предоставил хороший пример моей проблемы здесь. Кажется, это действительно ошибка в ListBox
. Обходной путь, который не соответствует моему сценарию, потому что мне нужно взаимодействовать с элементами управления внутри элемента ListBox
.
Теперь я пытаюсь поймать событие ManipulationCompleted
и проверить, есть ли он Inertial
, если это означает, что прокрутка и я устанавливаю фокус на страницу:
void messagesList_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
if (e.IsInertial)
this.Focus();
}
P.S. спасибо за пожелания удачи;)