x:Load 특성x:Load attribute

XAML 앱의 시작, 시각적 트리 생성 및 메모리 사용을 최적화 하기 위해 X:load 를 사용할 수 있습니다.You can use x:Load to optimize the startup, visual tree creation, and memory usage of your XAML app. X:load 를 사용 하면 표시와 유사한 시각적 효과가 있습니다. 단, 요소가 로드 되지 않은 경우에는 해당 메모리를 해제 하 고 내부적으로 작은 자리 표시자를 사용 하 여 시각적 트리에서 해당 자리를 표시 합니다.Using x:Load has a similar visual effect to Visibility, except that when the element is not loaded, its memory is released and internally a small placeholder is used to mark its place in the visual tree.

X:Load로 특성이 지정 된 UI 요소는 코드를 통해 로드 및 언로드될 수 있습니다. 또는 X:load 식을 사용할 수 있습니다.The UI element attributed with x:Load can be loaded and unloaded via code, or using an x:Bind expression. 자주 표시 되거나 조건부로 표시 되는 요소의 비용을 줄이는 데 유용 합니다.This is useful to reduce the costs of elements that are shown infrequently or conditionally. Grid 또는 StackPanel과 같은 컨테이너에서 x:Load를 사용 하는 경우 컨테이너와 모든 자식 항목이 그룹으로 로드 되거나 언로드됩니다.When you use x:Load on a container such as Grid or StackPanel, the container and all of its children are loaded or unloaded as a group.

XAML 프레임 워크에서 지연 된 요소를 추적 하면 x:Load를 사용 하 여 특성을 지정 하는 각 요소에 대 한 메모리 사용에 약 600 바이트를 추가 하 여 자리 표시자를 고려 합니다.The tracking of deferred elements by the XAML framework adds about 600 bytes to the memory usage for each element attributed with x:Load, to account for the placeholder. 따라서 성능이 실제로 감소 하는 범위에 대해이 특성을 과도 하 게 사용할 수 있습니다.Therefore, it's possible to overuse this attribute to the extent that your performance actually decreases. 숨겨야 하는 요소에만 사용 하는 것이 좋습니다.We recommend that you only use it on elements that need to be hidden. 컨테이너에서 x:Load를 사용 하는 경우에는 x:Load 특성이 있는 요소에 대해서만 오버 헤드가 지불 됩니다.If you use x:Load on a container, then the overhead is paid only for the element with the x:Load attribute.

중요

X:Load 특성은 Windows 10 버전 1703 (크리에이터 업데이트)부터 사용할 수 있습니다.The x:Load attribute is available starting in Windows 10, version 1703 (Creators Update). X:Load.를 사용 하려면 Visual Studio 프로젝트에서 대상으로 지정 된 최소 버전이 Windows 10 크리에이터 업데이트 (10.0, 빌드 15063) 여야 합니다.The min version targeted by your Visual Studio project must be Windows 10 Creators Update (10.0, Build 15063) in order to use x:Load.

XAML 특성 사용XAML attribute usage

<object x:Load="True" .../>
<object x:Load="False" .../>
<object x:Load="{x:Bind Path.to.a.boolean, Mode=OneWay}" .../>

요소 로드Loading Elements

여러 가지 방법으로 요소를 로드할 수 있습니다.There are several different ways to load the elements:

  • X:bind 식을 사용 하 여 로드 상태를 지정 합니다.Use an x:Bind expression to specify the load state. 식은 로드 하려면 true 를 반환 하 고, 요소를 언로드하려면 false 를 반환 해야 합니다.The expression should return true to load and false to unload the element.
  • 요소에 대해 정의한 이름으로 FindName 을 호출 합니다.Call FindName with the name that you defined on the element.
  • 요소에 대해 정의한 이름으로 system.windows.frameworkelement.gettemplatechild 를 호출 합니다.Call GetTemplateChild with the name that you defined on the element.
  • Visualstate에서 x:load 요소를 대상으로 하는 Setter 또는 Storyboard 애니메이션을 사용 합니다.In a VisualState, use a Setter or Storyboard animation that targets the x:Load element.
  • 모든 Storyboard에서 언로드된 요소를 대상으로 합니다.Target the unloaded element in any Storyboard.

참고: 요소 인스턴스화가 시작 되 면 UI 스레드에 생성 되므로 한 번에 너무 많이 생성 된 경우 UI가 끊길 될 수 있습니다.NOTE: Once the instantiation of an element has started, it is created on the UI thread, so it could cause the UI to stutter if too much is created at once.

이전에 나열 된 방법 중 하나에서 지연 된 요소를 만든 후에는 다음과 같은 몇 가지 작업을 수행 합니다.Once a deferred element is created in any of the ways listed previously, several things happen:

  • 요소에 대해 로드 된 이벤트가 발생 합니다.The Loaded event on the element is raised.
  • X:Name 필드는 설정 됩니다.The field for x:Name is set.
  • 요소에 대 한 모든 x:Bind 바인딩이 평가 됩니다.Any x:Bind bindings on the element are evaluated.
  • 지연 된 요소를 포함 하는 속성에 대 한 속성 변경 알림을 수신 하도록 등록 한 경우 알림이 발생 합니다.If you have registered to receive property change notifications on the property containing the deferred element(s), the notification is raised.

요소 언로드Unloading elements

요소를 언로드하려면:To unload an element:

  • X:Bind 식을 사용 하 여 로드 상태를 지정 합니다.Use an x:Bind expression to specify the load state. 식은 로드 하려면 true 를 반환 하 고, 요소를 언로드하려면 false 를 반환 해야 합니다.The expression should return true to load and false to unload the element.
  • 페이지 또는 UserControl에서 UnloadObject 를 호출 하 고 개체 참조를 전달 합니다.In a Page or UserControl, call UnloadObject and pass in the object reference
  • XamlMarkupHelper UnloadObject 를 호출 하 고 개체 참조를 전달 합니다.Call Windows.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject and pass in the object reference

개체가 언로드되면 해당 개체가 트리에서 자리 표시자로 바뀝니다.When an object is unloaded, it will be replaced in the tree with a placeholder. 개체 인스턴스는 모든 참조가 해제 될 때까지 메모리에 유지 됩니다.The object instance will remain in memory until all references have been released. 페이지/UserControl의 UnloadObject API는 x:Name 및 x:Bind. 대해 codegen에서 보유 한 참조를 해제 하도록 디자인 되었습니다.The UnloadObject API on a Page/UserControl is designed to release the references held by codegen for x:Name and x:Bind. 앱 코드에서 추가 참조를 보유 하는 경우에도 해제 해야 합니다.If you hold additional references in app code they will also need to be released.

요소가 언로드될 때 요소와 연결 된 모든 상태는 무시 되므로 x:Load를 최적화 된 버전의 표시 유형으로 사용 하는 경우 모든 상태가 바인딩을 통해 적용 되는지 확인 하거나 로드 된 이벤트가 발생할 때 코드에 의해 다시 적용 되는지 확인 합니다.When an element is unloaded, all state associated with the element will be discarded, so if using x:Load as an optimized version of Visibility, then ensure all state is applied via bindings, or is re-applied by code when the Loaded event is fired.

제한 사항Restrictions

X:load 사용에 대 한 제한 사항은 다음과 같습니다.The restrictions for using x:Load are:

  • 요소를 나중에 x:Name   찾을 수 있는 방법이 필요 하므로 요소에 대해 x:Name을 정의 해야 합니다.You must define an x:Name for the element, as there needs to be a way to find the element later.
  • UIElement 또는 FlyoutBase에서 파생 된 형식에 대해서만 x:load를 사용할 수 있습니다.You can only use x:Load on types that derive from UIElement or FlyoutBase.
  • 페이지, UserControl또는 DataTemplate의 루트 요소에는 x:load를 사용할 수 없습니다.You cannot use x:Load on root elements in a Page, a UserControl, or a DataTemplate.
  • ResourceDictionary의 요소에는 x:load를 사용할 수 없습니다.You cannot use x:Load on elements in a ResourceDictionary.
  • XamlReader로 로드 된 느슨한 XAML에는 x:load를 사용할 수 없습니다.You cannot use x:Load on loose XAML loaded with XamlReader.Load.
  • 부모 요소를 이동 하면 로드 되지 않은 모든 요소가 지워집니다.Moving a parent element will clear out any elements that have not been loaded.

설명Remarks

중첩 된 요소에 대해 x:Load를 사용할 수 있지만의 가장 바깥쪽 요소에서이를 인식 해야 합니다.You can use x:Load on nested elements, however they have to be realized from the outer-most element in. 부모를 인식 하기 전에 자식 요소를 실현 하려고 하면 예외가 발생 합니다. If you try to realize a child element before the parent has been realized, an exception is raised.

일반적으로 첫 번째 프레임에서는 볼 수 없는 요소를 지연 하는 것이 좋습니다.Typically, we recommend that you defer elements that are not viewable in the first frame.연기할 후보를 찾기 위한 좋은 지침은 축소 표시를 사용 하 여 생성 되는 요소를 찾는 것입니다. A good guideline for finding candidates to be deferred is to look for elements that are being created with collapsed Visibility. 또한 사용자 상호 작용에 의해 트리거되는 UI는 연기할 수 있는 요소를 찾을 수 있는 좋은 위치입니다.Also, UI that is triggered by user interaction is a good place to look for elements that you can defer.

ListView에서 요소를 지연 하는 것은 시작 시간을 단축 하 고, 만드는 항목에 따라 패닝 성능을 낮출 수도 있으므로 주의 해야 합니다.Be wary of deferring elements in a ListView, as it will decrease your startup time, but could also decrease your panning performance depending on what you're creating. 패닝 성능을 향상 시키려면 {X:bind} 태그 확장x:phase 특성 설명서를 참조 하세요.If you are looking to increase panning performance, see the {x:Bind} markup extension and x:Phase attribute documentation.

X:phase 특성이 x:phase 와 함께 사용 되 면 요소 또는 요소 트리가 실현 될 때 바인딩이 현재 단계까지 적용 됩니다.If the x:Phase attribute is used in conjunction with x:Load then, when an element or an element tree is realized, the bindings are applied up to and including the current phase. X:phase 에 지정 된 단계는 요소의 로드 상태에 영향을 주거나이를 제어 합니다.The phase specified for x:Phase does affect or control the loading state of the element. 목록 항목이 이동의 일부로 재활용 되 면 인식 된 요소는 다른 활성 요소와 같은 방식으로 동작 하 고 컴파일된 바인딩 ({X:bind} 바인딩)은 단계적으로 중단를 비롯 한 동일한 규칙을 사용 하 여 처리 됩니다.When a list item is recycled as part of panning, realized elements will behave in the same way as other active elements, and compiled bindings ({x:Bind} bindings) are processed using the same rules, including phasing.

일반적인 지침은 원하는 성능을 얻을 수 있도록 하기 전후에 앱의 성능을 측정 하는 것입니다.A general guideline is to measure the performance of your app before and after to make sure you are getting the performance that you want.

예제Example

<StackPanel>
    <Grid x:Name="DeferredGrid" x:Load="False">
        <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="Orange" Margin="0,0,4,4"/>
        <Rectangle Height="100" Width="100" Fill="Green" Grid.Column="1" Margin="4,0,0,4"/>
        <Rectangle Height="100" Width="100" Fill="Blue" Grid.Row="1" Margin="0,4,4,0"/>
        <Rectangle Height="100" Width="100" Fill="Gold" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0"
                   x:Name="one" x:Load="{x:Bind (x:Boolean)CheckBox1.IsChecked, Mode=OneWay}"/>
        <Rectangle Height="100" Width="100" Fill="Silver" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0"
                   x:Name="two" x:Load="{x:Bind Not(CheckBox1.IsChecked), Mode=OneWay}"/>
    </Grid>

    <Button Content="Load elements" Click="LoadElements_Click"/>
    <Button Content="Unload elements" Click="UnloadElements_Click"/>
    <CheckBox x:Name="CheckBox1" Content="Swap Elements" />
</StackPanel>
// This is used by the bindings between the rectangles and check box.
private bool Not(bool? value) { return !(value==true); }

private void LoadElements_Click(object sender, RoutedEventArgs e)
{
    // This will load the deferred grid, but not the nested
    // rectangles that have x:Load attributes.
    this.FindName("DeferredGrid"); 
}

private void UnloadElements_Click(object sender, RoutedEventArgs e)
{
     // This will unload the grid and all its child elements.
     this.UnloadObject(DeferredGrid);
}