Атрибут x:DeferLoadStrategy
Внимание
Начиная с Windows 10 версии 1703 (Creators Update), x:DeferLoadStrategy заменен атрибутом x:Load. Использование эквивалентно x:DeferLoadStrategy="Lazy"
использованиюx:Load="False"
, но обеспечивает возможность выгрузки пользовательского интерфейса при необходимости. Дополнительные сведения см. в атрибуте x:Load.
Для оптимизации производительности запуска или создания дерева приложения XAML можно использовать x:DeferLoadStrategy="Lazy". При использовании x:DeferLoadStrategy="Lazy" создание элемента и его дочерних элементов отложено, что снижает затраты на время запуска и память. Это полезно для уменьшения затрат на элементы, которые отображаются редко или условно. Элемент будет реализован, когда он ссылается на код или VisualStateManager.
Однако отслеживание отложенных элементов платформой XAML добавляет около 600 байт к использованию памяти для каждого затронутого элемента. Чем больше дерево элементов вы откладываете, тем больше времени запуска вы сохраните, но за счет большего объема памяти. Таким образом, можно перепользовать этот атрибут в той степени, в которой снижается производительность.
Использование атрибутов XAML
<object x:DeferLoadStrategy="Lazy" .../>
Замечания
Ограничения для использования x:DeferLoadStrategy :
- Необходимо определить x:Name для элемента, так как его необходимо найти позже.
- Вы можете отложить только типы, производные от UIElement или FlyoutBase.
- Вы не можете отложить корневые элементы на странице, UserControl или DataTemplate.
- Нельзя отложить элементы в ResourceDictionary.
- Не удается отложить свободный код XAML, загруженный с помощью XamlReader.Load.
- Перемещение родительского элемента очищает все элементы, которые не были реализованы.
Существует несколько различных способов реализации отложенных элементов:
- Вызовите FindName с именем, определенным в элементе.
- Вызовите GetTemplateChild с именем, определенным в элементе.
- В VisualState используйте анимацию Setter или Storyboard, предназначенную для отложенного элемента.
- Нацелив на отложенный элемент в любой раскадровки.
- Используйте привязку, предназначенную для отложенного элемента.
ПРИМЕЧАНИЕ. После запуска экземпляра элемента он создается в потоке пользовательского интерфейса, поэтому пользовательский интерфейс может заглушиться, если слишком много создается одновременно.
После создания отложенного элемента в любом из перечисленных ранее способов происходит несколько действий.
- Вызывается событие Loaded в элементе.
- Вычисляются все привязки элемента.
- Если вы зарегистрировали для получения уведомлений об изменении свойств для свойства, содержащего отложенные элементы, создается уведомление.
Вы можете вложить отложенные элементы, однако их необходимо реализовать из внешнего элемента. Если вы пытаетесь реализовать дочерний элемент перед реализацией родительского элемента, создается исключение.
Как правило, рекомендуется отложить элементы, которые недоступны для просмотра в первом кадре. Хорошее руководство по поиску кандидатов, которые должны быть отложены, заключается в поиске элементов, создаваемых с свернутой видимостью. Кроме того, пользовательский интерфейс, активируемый взаимодействием с пользователем, является хорошим местом для поиска элементов, которые можно отложить.
Будьте осторожны с отсрочкой элементов в ListView, так как это уменьшит время запуска, но также может снизить производительность сдвига в зависимости от того, что вы создаете. Если вы хотите увеличить производительность сдвига, ознакомьтесь с расширением разметки {x:Bind} и документацией по атрибутам x:Phase.
Если атрибут x:Phase используется в сочетании с x:DeferLoadStrategy, то при реализации элемента или дерева элементов привязки применяются вплоть до текущего этапа. Этап, указанный для x:Phase , не влияет на отсрочку элемента или управляет его отсрочкой. Когда элемент списка перезапускается в рамках сдвига, реализованные элементы ведут себя так же, как и другие активные элементы, а скомпилированные привязки ({x:Bind} привязки) обрабатываются с помощью одних и того же правила, включая фазирование.
Общее руководство заключается в измерении производительности приложения до и после, чтобы убедиться, что вы получаете нужную производительность.
Пример
<Grid x:Name="DeferredGrid" x:DeferLoadStrategy="Lazy">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Rectangle Height="100" Width="100" Fill="#F65314" Margin="0,0,4,4" />
<Rectangle Height="100" Width="100" Fill="#7CBB00" Grid.Column="1" Margin="4,0,0,4" />
<Rectangle Height="100" Width="100" Fill="#00A1F1" Grid.Row="1" Margin="0,4,4,0" />
<Rectangle Height="100" Width="100" Fill="#FFBB00" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0" />
</Grid>
<Button x:Name="RealizeElements" Content="Realize Elements" Click="RealizeElements_Click"/>
private void RealizeElements_Click(object sender, RoutedEventArgs e)
{
// This will realize the deferred grid.
this.FindName("DeferredGrid");
}