0

大きなサイズのCanvasと、その上に配置された多くの小さなユーザーコントロールがあります。一度に、キャンバスのごく一部だけが画面に表示されます。ユーザーコントロールは、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>

現在、ユーザーコントロールの数が非常に多いため、キャンバス全体をロードするのに多くの時間がかかります。現在表示されているフレームにあるコントロールのみをロードしたい。キャンバスを移動すると、新しい表示領域の下にあるユーザーコントロールが読み込まれるはずです。これを実行したい主な理由は、多数のユーザーコントロールのロードに関連するパフォーマンスの遅れのためです。VirtualizingStackPanelがStackPanelに対して行うことをCanvasで実行したいと思います。

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

助けてくれてありがとう

4

2 に答える 2

0

仮想化を検討してください。Canvas を使用する代わりに、VirtualizingPanelの独自の実装で ListBox を使用します。これは、Canvas として機能し、表示されるはずのコントロールのみを作成します。

UI の仮想化に関する優れたリソースが多数あります。

于 2012-02-07T14:14:01.447 に答える
0

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

その場合は、IsVisibleChanged イベントの発生時にそれ自体をキャンバスとして使用してターゲット ユーザー コントロールをロードする単純なプレース ホルダー ユーザー コントロールを作成します。

すべては最初のテスト次第です。

于 2012-01-28T05:11:44.043 に答える