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