Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Это важно
Начиная с Windows 10 версии 1703 (Creators Update), x:DeferLoadStrategy заменен атрибутом x:Load. Использование x:Load="False" эквивалентно x:DeferLoadStrategy="Lazy", но обеспечивает возможность выгрузки UI при необходимости. Дополнительные сведения см. в атрибуте 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 , предназначенную для отложенного элемента.
- Целевой элемент отложенного выполнения в любом Storyboard.
- Используйте привязку, которая нацелена на отложенный элемент.
ПРИМЕЧАНИЕ. После инициализации экземпляра элемента он создается в потоке пользовательского интерфейса, поэтому пользовательский интерфейс может замедляться или прерываться, если слишком много создается за раз.
После создания отложенного элемента в любом из перечисленных ранее способов происходит несколько действий.
- Вызывается событие Loaded в элементе.
- Вычисляются все привязки элемента.
- Если вы зарегистрировались для получения уведомлений об изменении свойств в отношении объекта, содержащего отложенные элементы, уведомление отправляется.
Вы можете вкладывать отложенные элементы, однако их необходимо реализовывать начиная с самого внешнего элемента внутрь. Если вы пытаетесь реализовать дочерний элемент до того, как был реализован родительский элемент, возникает исключение.
Как правило, рекомендуется отложить элементы, которые недоступны для просмотра в первом кадре. Хорошее правило для отбора кандидатов, которые должны быть отложены, заключается в поиске элементов, создаваемых с "свернутой" видимостью. Кроме того, пользовательский интерфейс, активируемый взаимодействием с пользователем, является хорошим местом для поиска элементов, которые можно отложить.
Будьте осторожны с отсрочкой элементов в ListView, так как это уменьшит время запуска, но также может снизить производительность прокрутки в зависимости от того, что вы создаете. Если вы хотите увеличить производительность панорамирования, ознакомьтесь с расширением разметки {x:Bind} и документацией по атрибуту x:Phase.
Если атрибут x:Phase используется в сочетании с x:DeferLoadStrategy , то при реализации элемента или дерева элементов привязки применяются вплоть до текущего этапа. Этап, указанный для x:Phase, не влияет на отсрочку элемента и не контролирует её. Когда элемент списка перерабатывается в рамках прокрутки, материализованные элементы ведут себя так же, как и другие активные элементы, а скомпилированные привязки ({x:Bind}) обрабатываются по тем же правилам, включая фазирование.
Общее руководство заключается в измерении производительности приложения до и после, чтобы убедиться, что вы получаете нужную производительность.
Example
<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");
}
Windows developer