で奇妙な振る舞いをしてい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
間違った計算をし、下部で非常に奇妙な結果になります(画像、右の画像を参照)正常な動作を示します)。
調査の後、私はその問題を組み合わせて理解し、このカップルから 1 つの要素を削除するVirtualizingStackPanel
とTextBlock.TextWrap="Wrap"
、すべて正しく動作します。
TextWrap
しかし、アイテム数が多く、正しいテキスト表示のために仮想化が必要です。
そこで、Virtualizing Panel を独自に実装することを考えています。これを行う方法、または現在の問題を修正する方法を教えていただけますか?
UPD: 問題:
最初の 2 つの画像ListBox
は既に (!) 一番下までスクロールされていますが (これ以上下にスクロールすることはできません)、要素が正しく配置されておらず、正しい配置が右の画像に示されています。これは、非常に速くスクロールする場合にのみ発生します。
UPD2: Milan Aggarwal に感謝します。彼はここで私の問題の良い例を提供してくれました。それは本当にバグのようListBox
です。ListBox
アイテム内のコントロールを操作する必要があるため、提供された回避策は私のシナリオには適合しません。今、私はManipulationCompleted
イベントをキャッチして、それが であるかどうかを確認しようとしていInertial
ます。そうであれば、それはスクロールを意味し、ページにフォーカスを設定します:
void messagesList_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e)
{
if (e.IsInertial)
this.Focus();
}
PS 幸運を祈ります;)