Как выборочно загрузить большое количество элементов управления в Canvas - PullRequest
0 голосов
/ 28 января 2012

У меня Canvas большого размера и над ним расположено множество маленьких пользовательских элементов управления.В то время только небольшая часть холста видна на экране.Пользовательские элементы управления создаются 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.

Есть ли способ сделать это?

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 07 февраля 2012

Посмотрите на виртуализацию.Вместо использования Canvas используйте ListBox с собственной реализацией VirtualizingPanel , которая может действовать как Canvas и будет создавать только те элементы управления, которые должны быть видимыми.

Существует многобольшие ресурсы по виртуализации пользовательского интерфейса, вот два быстрых выбора:

0 голосов
/ 28 января 2012

Сначала проверьте загрузку пустых пользовательских элементов управления.Это пользовательские элементы управления, которые вообще ничего не отображают.Если это достаточно быстро, это говорит нам о том, что проблема не в холсте, обрабатывающем большое количество пользовательских элементов управления, а в инициализации пользовательских элементов управления.

Так что, если это так, создайте пользователя простого заполнителяконтролировать, что при запуске события IsVisibleChanged загружает целевой пользовательский элемент управления, используя себя в качестве холста.

Все зависит от первого теста.

...