scrollviewerでのWPF / C#Textwrappingにより、ウィンドウのサイズ変更が遅くなる

StackOverflow https://stackoverflow.com/questions/802103

質問

こんにちは。

スクロールビューアーを含むListBoxがあります。リストボックスの各アイテム(40 ++アイテム)には、テキストブロックと小さな画像が含まれています。 ウィンドウのサイズを変更すると、サイズ変更が非常に遅くなります。アイテムのテキストブロックの可視性を「折りたたみ」にすると、サイズ変更は問題ありません。私の最初のアプローチは、スクロールビューアーに表示されない各アイテムの可視性を「折りたたみ」に設定することでしたが、アイテムがユーザーに表示されるときにインジケーターが見つかりませんでした。

サイズ変更プロセスの遅延を少なくするためのアイデアはありますか?おそらく、テキストブロックではなく他のコントロールですか? ご協力いただきありがとうございます。

役に立ちましたか?

解決 2

サイズ変更のパフォーマンスを改善する最良の方法は、ScrollContentPresenter内で VirtualizingStackPanel を使用することです。これは、たとえばListBoxのデータテンプレートで、または一般にItemsPanelでオーバーライドできます。

ユーザーに表示されているかどうかに関係なく、すべてのアイテムを常にレンダリングする通常のStackPanelと比較して、非表示のアイテムはレンダリングしません。

非常にうまく機能します。

他のヒント

以下は、指定されたオフセットのアイテムが表示されるかどうかを指定します:

public bool IsItemVisible(ListBox listBox, int index)
{
    if (listBox.Items.Count != 0)
    {
        VirtualizingStackPanel vsp = (VirtualizingStackPanel)VisualTreeHelper.GetParent(listBox.ItemContainerGenerator.ContainerFromIndex(0));
        int FirstVisibleItem = (int)vsp.VerticalOffset, VisibleItemCount = (int)vsp.ViewportHeight;
        return index >= FirstVisibleItem && index <= FirstVisibleItem + VisibleItemCount;
    }

    return false;
}

次のように使用できます:

private void Button_Click(object sender, RoutedEventArgs e)
{
    for (int i = listbox1.Items.Count - 1; i >= 0; i--)
        if (!IsItemVisible(listbox1, i))
            ((ListBoxItem)listbox1.Items[i]).Visibility = Visibility.Collapsed;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top