2016-04-11 18 views
0

WPFのListBoxコントロールにDataContextを割り当てるときに、恐ろしいUIフリーズの問題を解決できないようです。DataContextフリーズを最適化する方法

私はWindow.Resourcesで定義されたDataTemplateを持っています。 アプリケーションが起動すると、ImageInfoには、URIパスやBitmapImageを含む、ロードされたイメージに関するさまざまな情報が格納されているリストのイメージが読み込まれ、ソートされます。

ListBoxコントロールのDataContextとしてこのリストを割り当てると、問題はありませんが、私は解決できないように見えますが、実際には巨大なフリーズが発生します。私はそうのようにDataContext割り当てる

<DataTemplate> 
     <Grid HorizontalAlignment="Left" Width="260" Height="360"> 
      <Border Padding="5" Margin="10" BorderBrush="Orange"> 
       <Image Source="{Binding image}" Stretch="Fill" HorizontalAlignment="Center"/> 
      </Border> 
      <Border Background="Black" VerticalAlignment="Bottom" HorizontalAlignment="Stretch" Opacity="0.70" Height="50" Margin="0,10,10,0"></Border> 
      <StackPanel VerticalAlignment="Bottom" Orientation="Horizontal" HorizontalAlignment="Center"> 
       <!-- 3 buttons --> 
      </StackPanel> 
     </Grid> 
    </DataTemplate> 

<ItemsPanelTemplate> 
     <UniformGrid Columns="3" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/> 
    </ItemsPanelTemplate> 

lbGallery.DataContext = lst169; 

リストは、10の以上の項目が含まれています。 BitmapImageとしてロードイメージをスキップし、代わりに使用してパス

  • からわずかURIを使用して

    • グリッド上のいくつかの仮想化オプションを試す

    • は、これまでのところ、私はして問題を解決しようとしましたグリッドの固定サイズ

    私は起動時に一度だけデータを読み込むため、lst169でファイルを読み込む際に問題がコードに関係しないと確信しています。 BitmapImageの代わりにURIを使用すると、イメージを取得するための私のメソッドも問題ではないことが保証されました。

    すべてが、そのDataContextをリストボックスコントロールに設定します。

    これを行う適切な方法は何ですか?

    ありがとうございます!

    EDIT:

    1. アプリケーションは
    2. リソースデータは、(異なるイメージを持つ3つのリストが)一度
    3. リストにロードされて起動します:私のポストは、多くのユーザーを混乱されているので

      明確にしますデータが完全にロードされたとき、ListBoxのDataContextとして完全にロードされたリストを1つ設定する

    これはフリーズが発生したときです。

    後でユーザーは、ボタンをクリックして画像を切り替えることができます。私はこの時間の間にもDataContextを切り替えます。フリーズが起こる。

    Soフリーズは起動時にリソースを読み込むことによって発生しません。画像がImageコントロールにバインドされるとき、リストボックスのDataContextをListに設定することによって発生します。私がBitmapImage型、またはURIを絶対パスでバインドしているかどうかにかかわらず。

  • +0

    ルックに。フリーズがリソースの読み込み時間である場合、メインウィンドウ(スプラッシュウィンドウ "Loading ..")を表示する前にそれを行うか、非同期で行うか(例えば、アイテムを1つずつ追加するか、プレースホルダを追加してから実際のイメージをロードするなど) [仮想化](http://stackoverflow.com/q/25070178/1997232)。 – Sinatr

    答えて

    1

    は、あなたの設定を試してみましたイメージの結合性早けれすることができますように真のisAsync = MVVMのため

    <Image Source="{Binding image, IsAsync=True}" Stretch="Fill" HorizontalAlignment="Center"/> 
    
    +0

    ありがとう、 これはまだ凍結を引き起こし、ちょっと違う動作です。 コンテナが描かれているのが見えますが、フリーズして数秒後にイメージが完全に読み込まれます。 IsAsyncのフリーズがなければ、まずすべてが表示されます。 – Hrcak

    +0

    私はそれが正しい場合、起動時にBitmapImageを読み込んでいますか? 読み込んだ後にBitmapImagesをフリーズしようとしましたか? img.Freeze(); 仮想化に加えて、パフォーマンスが向上する可能性があります。 – Spongebrot

    関連する問題