중요합니다
Windows 10 버전 1703(크리에이터스 업데이트)부터 x:DeferLoadStrategy 는 x:Load 특성으로 대체됩니다. 사용 x:Load="False" 은 x:DeferLoadStrategy="Lazy"동일하지만 필요한 경우 UI를 언로드하는 기능을 제공합니다. 자세한 내용은 x:Load 특성을 참조하세요.
x:DeferLoadStrategy="Lazy"를 사용하여 XAML 앱의 시작 또는 트리 생성 성능을 최적화할 수 있습니다. x:DeferLoadStrategy="Lazy"를 사용하면 요소와 해당 자식의 생성이 지연되어 시작 시간과 메모리 비용이 줄어듭니다. 이는 드물게 또는 조건부로 표시되는 요소의 비용을 줄이는 데 유용합니다. 이 요소는 코드 또는 VisualStateManager에서 참조될 때 실현됩니다.
그러나 XAML 프레임워크에서 지연된 요소를 추적하면 영향을 받는 각 요소의 메모리 사용량에 약 600바이트가 추가됩니다. 지연하는 요소 트리가 클수록 더 많은 시작 시간을 절약할 수 있지만 메모리 공간은 커집니다. 따라서 성능이 저하되는 범위까지 이 특성을 과도하게 사용할 수 있습니다.
XAML 특성 사용
<object x:DeferLoadStrategy="Lazy" .../>
비고
x:DeferLoadStrategy 사용에 대한 제한 사항은 다음과 같습니다.
- 나중에 요소를 찾는 방법이 필요하므로 요소의 x:Name 을 정의해야 합니다.
- UIElement 또는 FlyoutBase에서 파생되는 형식만 연기할 수 있습니다.
- Page, UserControl 또는 DataTemplate의 루트 요소는 연기할 수 없습니다.
- ResourceDictionary의 요소는 연기할 수 없습니다.
- XamlReader.Load로 로드된 느슨한 XAML을 연기할 수 없습니다.
- 부모 요소를 이동하면 실현되지 않은 요소가 지워지게 됩니다.
지연된 요소를 실현하는 방법에는 여러 가지가 있습니다.
- 요소에 정의한 이름으로 FindName 을 호출합니다.
- 요소에 정의한 이름으로 GetTemplateChild 를 호출합니다.
- VisualState에서 지연된 요소를 대상으로 하는 Setter 또는 Storyboard 애니메이션을 사용합니다.
- 모든 Storyboard에서 지연된 요소를 대상으로 지정합니다.
- 지연된 요소를 대상으로 하는 바인딩을 사용합니다.
참고: 요소의 인스턴스화가 시작되면 UI 스레드에서 만들어지므로 한 번에 너무 많이 만들어지면 UI가 더듬거릴 수 있습니다.
이전에 나열된 방법으로 지연된 요소가 만들어지면 다음과 같은 몇 가지 상황이 발생합니다.
- 요소의 Loaded 이벤트가 발생합니다.
- 요소의 모든 바인딩이 평가됩니다.
- 지연된 요소가 포함된 속성에 대한 속성 변경 알림을 받도록 등록한 경우 알림이 발생합니다.
지연된 요소를 중첩할 수 있지만 가장 외부 요소에서 실현해야 합니다. 부모가 실현되기 전에 자식 요소를 실현하려고 하면 예외가 발생합니다.
일반적으로 첫 번째 프레임에서 볼 수 없는 요소를 연기하는 것이 좋습니다. 지연할 후보를 찾기 위한 좋은 지침은 축소된 가시성으로 생성되는 요소를 찾는 것입니다. 또한 사용자 상호 작용에 의해 트리거되는 UI는 연기할 수 있는 요소를 찾는 데 적합합니다.
시작 시간이 줄어들지만 만드는 항목에 따라 이동 성능이 저하될 수 있으므로 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