Загрузите TabItem асинхронно - PullRequest
       1

Загрузите TabItem асинхронно

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

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

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

У кого-нибудь есть идея?

1 Ответ

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

Это зависит от того, что загрузка занимает много времени.

Если данные вызывают паузу, то загружайте данные асинхронно и отображайте местозаполнитель при загрузке данных.После завершения загрузки данных вы можете изменить их на фактический контент.

Вот один из примеров,

<ContentControl>
    <ContentControl.Style>
        <Style TargetType="{x:Type ContentControl}">
            <Setter Property="ContentTemplate" Value="{StaticResource TabContentTemplate}" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsLoading}" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource LoadingTemplate}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

Где ваш RelayCommand, который изменяет SelectedItem, может выглядеть примерно такэто:

void ChangeTab(ITabViewModel newTab)
{
    // Set loading flag and set tab as Selected
    newTab.IsLoading = true;
    SelectedTab = newTab;

    // Create async task
    var asyncTask = new Task(() => newTab.LoadData());

    // This runs after task is finished running
    asyncTask.ContinueWith(p => newTab.IsLoading = false));

    // Start async task
    asyncTask.Start();
}

Если для загрузки вашего пользовательского интерфейса требуется некоторое время, то пользователям, возможно, просто придется иметь дело с начальным временем загрузки при первой загрузке вкладки, однако вы можете остановить задержку при переключении.на уже загруженную вкладку с помощью , расширяющей TabControl для предотвращения его уничтожения его TabItems .

Стандартное поведение WPF TabControl - выгрузить TabItem при переключении на другую вкладку и перезагрузить его, когда вы вернетесь.Этот обходной путь сохраняет ContentPresenter уже загруженной вкладки и перезагружает сохраненную вкладку вместо загрузки новой вкладки при переключении обратно.

В большинстве случаев задержка пользовательского интерфейса вызвана очень большим количествомЭлементы пользовательского интерфейса на экране.Попробуйте также уменьшить количество элементов на вкладке.Например, Labels состоит из большего количества элементов, чем TextBlocks, поэтому, если вам не нужны специфичные для метки возможности, такие как выделение, попробуйте использовать Labels вместо TextBlocks

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...