2017-07-07 9 views
0

リストボックスアイテムが表示されるタイミングを知らせるイベントはありますか?ListBoxItemがいつ表示されるかを知るには?

問題は、私がListBox.ItemSourceとして設定した数千の要素を持つことができるということです。各要素はビットマップを生成します(しばらく時間がかかります)。このビットマップ生成をコンストラクタに配置するだけで、コレクションを作成するには永遠に時間がかかります。代わりに、アイテムが表示されたときにビットマップ生成を延期したいと考えています。

これを行う方法はありますか?理想的には、すべてのアイテムをループして表示されていないかどうかを確認することをお勧めします。

+0

あなたのリストボックスには、ImageコントロールをItemTemplateにする必要があります。 ImageコントロールのSourceプロパティは、ビューモデルアイテムクラスのプロパティにバインドする必要があります。仮想化により、バインディングは初期化されず、アイテムが実際に表示される前にソースプロパティにアクセスし、ListBoxItemコンテナが作成されます。要点は、プロパティゲッターが呼び出される前にビューモデルアイテムがビットマップを作成しないことです。 – Clemens

答えて

1

リストボックスの項目が表示されるタイミングを知らせるイベントはありますか?

あなたはListBoxItemコンテナのLoadedイベントを処理できます。

<ListBox> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <EventSetter Event="Loaded" Handler="OnItemLoaded" /> 
     </Style> 
    </ListBox.ItemContainerStyle> 
</ListBox> 

private void OnItemLoaded(object sender, RoutedEventArgs e) 
{ 
    ListBoxItem lbi = sender as ListBoxItem; 
    object dataItem = lbi.DataContext; 
    //... 
} 
+1

これは私が必要としていたものです。ありがとう! – Philipp

0

SelectedItemを使用して最初の選択を取得して、その上下の数個のビットマップを生成することができます。正確な数はビットマップのサイズとListBoxのサイズによって異なります。

新しいビットマップをレンダリングしている間は、リストを上下にパンすると、一定の待機時間ではないことがわかります。 Googleマップを考えてみましょう。短い距離をパンすると、画像はすでにそこにあります。それを描くときは、大きな距離をパンすると、それを描き直すまで待たなければなりません。

リストを上下にパンすると、IsMouseOverを使用して、現在ホバーオーバーしているアイテムを見つけて、それに応じてレンダリングしたビットマップを更新することができます。

関連する問題