x:DeferLoadStrategy 특성
Important
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} 바인딩)은 단계를 포함하여 동일한 규칙을 사용해 처리됩니다.
일반적인 지침은 이전과 이후에 앱의 성능을 측정하여 원하는 성능을 얻었는지 확인하기 위한 것입니다.
예제
<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");
}