2009-04-29 9 views
2

Hy。WPF/C#スクロールビューアでテキストラッピングを行うと、ウィンドウのサイズが遅くなります

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

誰もが、サイズ変更プロセスを遅らせることなく、テキストブロックの代わりに他のコントロールを使用する考えがありますか? ご協力いただきありがとうございます。

+0

XAMLまたは簡略化されたrepro plsを投稿してください。 –

答えて

0

ScrollContentPresenter内でVirtualizingStackPanelを使用します。 ListBoxなどのデータテンプレートや、一般的にはItemsPanelでこれをオーバーライドできます。

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

かなりうまく動作します。

0

与えられたオフセットでアイテムを表示するか否か、次の指定:

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; 
} 
+0

すべてのスクロール・アクティビティーとすべての単一サイズ変更イベント(マウス・ムーブ・イベントごとに、これはかなりの頻度で)でこのチェックが必要なので、私にはうまくいくかどうかわかりません。 少なくとも、すべてのアイテムが表示され、折りたたまれていないので、パフォーマンスが低下すると思います。 – dalind

+0

何らかの基準でリストボックスの内容をフィルタリングしないのはなぜですか? (たとえば、各項目の最初の文字で) – CSharper

+0

私はそれをフィルタリングしますが、私の視点ではこれは可視性とは関係ありません。アイテムの可視性は、スクロールビューワのトラックの移動ごとに変わる可能性があるので、フィルタリングは意味をなさないと私は考える。それとも私は何かを忘れてしまったのか? – dalind

関連する問題