2012-01-28 13 views
0

私は大きなサイズのキャンバスを持ち、多くの小さなユーザーコントロールを置いています。キャンバスの小さな部分だけが画面に表示されます。ユーザコントロールは、ViewModelにバインドされたデータであるItemsControlによって作成されます。キャンバスに多数のコントロールを選択的に読み込む方法

<Canvas Height="10000" Width="10000" Background="White" > 
    <ItemsControl ItemsSource="{Binding Path=MyData}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Views:MyControl /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemContainerStyle> 
      <Style TargetType="ContentPresenter"> 
       <Setter Property="Canvas.Left" Value="{Binding Left}"/> 
       <Setter Property="Canvas.Top" Value="{Binding Top}"/> 
      </Style> 
     </ItemsControl.ItemContainerStyle> 
    </ItemsControl> 
</Canvas> 

ユーザコントロールの数が膨大なので、キャンバス全体を読み込むには多くの時間がかかります。私は現在、可視フレームにあるコントロールだけをロードしたい。キャンバスを移動すると、新しい可視領域の下のユーザーコントロールを読み込む必要があります。私がこれをやりたい主な理由は、多数のユーザーコントロールの読み込みに伴うパフォーマンスの遅れが原因です。私はCanvasでVirtualizingStackPanelがStackPanelに対して何をしたいのですか?

これを行う方法はありますか?

ありがとうございます。

+1

[この](http://blogs.msdn.com/b /jgoldb/archive/2008/03/08/performant-virtualized-wpf-canvas.aspx)と[this](http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2- 100万件のitems.aspx)が興味深いかもしれません。 –

答えて

0

まず、空白のユーザーコントロールを読み込みます。それは何も表示しないユーザーコントロールです。これが十分速ければ、問題はキャンバス内に多数のユーザーコントロールを処理するのではなく、ユーザーコントロールを初期化することにあることがわかります。

その場合、IsVisibleChangedイベントの起動時にキャンバスとしてターゲットユーザーコントロールを読み込む単純なプレースホルダユーザーコントロールを作成します。

すべては、最初のテストに依存します。

0

仮想化を調べます。 Canvasを使用する代わりに、独自の実装のVirtualizingPanelを持つListBoxを使用します。これはCanvasと同じように動作し、表示されるはずのコントロールのみを作成します。

UIの仮想化上の多くの偉大なリソースがありますが、ここでは2迅速なピックは以下のとおりです。