문제

할 때 사용하는 리소스와 같이 브러시,템플릿 및 스타일에 WPF 그들은 지정할 수 있습으로 하나 StaticResources

<Rectangle Fill="{StaticResource MyBrush}" />

또는 DynamicResource

<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}"  />

대부분의 시간을 항상(?), 하나만 작동하고 다른 것입니다 던지 예외가 있습니다.그러나 나는 이유를 알고 싶은:

  • 무슨의 주요 차이입니다.다음과 같 메모리거나 성능에 미치는 영향
  • 은 이 규칙에서 WPF"와 같은 브러쉬는 항상 정적"및"템플릿은 항상 역동적이"etc.?

선택 사 Static vs 동적지 않으로 임의대로 보인...하지만 내가 실패하는 패턴을 참조 하십시오.

도움이 되었습니까?

해결책

staticResource 응용 프로그램이 실제로 실행되기 전에 발생하는 XAML을로드하는 동안 분해되어 속성에 할당됩니다. 한 번만 할당되며 리소스 사전에 대한 변경 사항은 무시됩니다.

DynamicResource 로드하는 동안 속성에 표현식 객체를 할당하지만 실제로 값이 값을 요구할 때 런타임까지 리소스를 실제로 조회하지는 않습니다. 이렇게하면 런타임이 필요할 때까지 리소스를 찾아보십시오. 좋은 예는 XAML에서 나중에 정의 된 리소스에 대한 전진 참조입니다. 또 다른 예는 런타임까지 존재하지 않는 리소스입니다. 소스 리소스 사전이 변경되면 대상을 업데이트합니다.

다른 팁

나는 또한 그들에 대해 혼란 스러웠다. 아래 의이 예를 참조하십시오.

<Window x:Class="WpfApplicationWPF.CommandsWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="CommandsWindow" Height="300" Width="300">

    <StackPanel>
        <Button Name="ButtonNew" 
                Click="ButtonNew_Click" 
                Background="{DynamicResource PinkBrush}">NEW</Button>
        <Image Name="ImageNew" 
               Source="pack://application:,,,/images/winter.jpg"></Image>
    </StackPanel>


    <Window.Background>
        <DynamicResource ResourceKey="PinkBrush"></DynamicResource>
    </Window.Background>

</Window>

여기서는 버튼과 창에 동적 리소스를 사용했으며 어디서나 선언하지 않았습니다.

버튼 이벤트를 클릭하기 위해 아래 코드를 추가하면 DynamicResource를 사용하므로 배경이 그에 따라 업데이트됩니다.

private void ButtonNew_Click(object sender, RoutedEventArgs e)
{
    this.Resources.Add(  "PinkBrush"
                         ,new SolidColorBrush(SystemColors.DesktopColor)
                       );
}

그들이 staticResource를 사용했다면 :

  • 자원은 XAML로 선언해야합니다
  • 그리고 그것도 "이전"이 사용됩니다.

내가 혼란을 없애기를 바랍니다.

STATICRESOURCE는 객체 구성에서 해결됩니다.
DynamicResource는 제어가 자원이 필요할 때마다 평가 및 해결됩니다.

논리 리소스를 사용하면 시각적 트리의 일부가 아니지만 사용자 인터페이스에서 사용할 수있는 XAML에서 객체를 정의 할 수 있습니다. 논리적 자원의 예 중 하나는 Brush이며 색 구성표를 제공하는 데 사용됩니다. 일반적으로 해당 객체는 자원으로 정의되며 응용 프로그램의 여러 요소에 의해 사용됩니다.

<Window.Resources>
    <RadialGradientBrush x:Key="myGradientBrush">
        <GradientStop Color="Green" Offset="0"/>
        <GradientStop Color="Blue" Offset="2"/>
    </RadialGradientBrush>
</Window.Resources>

이제 위의 선언 된 자원은 정적 또는 동적 리소스로 사용할 수 있습니다. 기억해야 할 한 가지 요점은 정적 자원을 사용할 때 XAML 코드로 먼저 정의해야한다는 것입니다. 정적 및 동적 리소스는 다음과 같이 사용할 수 있습니다.

<Grid Background="{StaticResource myGradientBrush}"></Grid>

또는:

<Grid Background="{DynamicResource myGradientBrush}"></Grid>

staticResource와 DynamicResource의 차이점은 참조 요소에 의해 리소스를 검색하는 방법에 있습니다. STATICRESOURCE는 참조 요소에 의해서만 검색되며 리소스의 전체 수명에 사용됩니다. 반면에, 참조 된 객체가 사용될 때마다 DynamicResource가 획득됩니다.

더 간단한 방식으로, 방사형 그레이드 브러시의 색상 속성이 코드에서 오렌지와 핑크로 변경되면 리소스가 동적 소스로 사용될 때만 요소에 반영됩니다. 아래는 코드에서 리소스를 변경하는 코드입니다.

RadialGradientBrush radialGradientBrush =
    new RadialGradientBrush(Colors.Orange, Colors.Pink);
this.Resources["myGradientBrush"] = radialGradientBrush;

DynamicResource의 Demerit은 자원이 사용될 때마다 검색되므로 응용 프로그램 성능을 줄이는 것입니다. 모범 사례는 DynamicResource를 사용해야 할 특정 이유가있을 때까지 정적으로 사용하는 것입니다.

원천:
WPF : STATICRESOURCE vs. DynamicResource

  1. StaticResource 사용 첫째 값이 있습니다.DynamicResource 사용 마지막 값이 있습니다.
  2. DynamicResource 사용할 수 있는 중첩된 스타일링,StaticResource 할 수 없습니다.

이 있다고 가정이 중첩된 스타일로 사전입니다.LightGreen 루트 수준에서는 동안 핑크는 중첩 그리드.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Grid}">
        <Style.Resources>
            <Style TargetType="{x:Type Button}" x:Key="ConflictButton">
                <Setter Property="Background" Value="Pink"/>
            </Style>
        </Style.Resources>
    </Style>
    <Style TargetType="{x:Type Button}" x:Key="ConflictButton">
        <Setter Property="Background" Value="LightGreen"/>
    </Style>
</ResourceDictionary>

에 view:

<Window x:Class="WpfStyleDemo.ConflictingStyleWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ConflictingStyleWindow" Height="100" Width="100">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Styles/ConflictingStyle.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Button Style="{DynamicResource ConflictButton}" Content="Test"/>
    </Grid>
</Window>

StaticResource 렌더링 버튼으로 LightGreen,첫 번째는 값은 그것을 발견에서 스타일입니다.DynamicResource 을 재정의합니다 LightGreen 버튼으로 분홍색으로 렌더링합니다.

StaticResource StaticResource

DynamicResource DynamicResource

유지 하는 마음에 대 디자이너 취급 DynamicResource 로 StaticResource.그것을 얻을 것이 첫 번째 값입니다.이 경우,대 디자이너가 렌더링 버튼으로 LightGreen 지만 실제로 그것을 끝으로 분홍색이다.

StaticResource 오류가 발생 할 때 루트-레벨 스타일(LightGreen)이 제거됩니다.

주요 차이점은 무엇입니까? 메모리 또는 성능의 영향과 같습니다

정적 자원과 동적 리소스의 차이는 기본 객체가 변경 될 때 발생합니다. 리소스 컬렉션에 정의 된 브러시가 코드로 액세스하고 다른 객체 인스턴스로 설정된 경우 사각형은이 변경 사항을 감지하지 않습니다.

정적 자원은 요소를 참조하여 한 번 검색하고 자원의 수명에 사용됩니다. 반면, DynamicResources는 사용될 때마다 검색됩니다.

동적 리소스의 단점은 응용 프로그램 성능을 줄이는 경향이 있다는 것입니다.

"브러시는 항상 정적입니다"및 "템플릿은 항상 동적입니다"등 WPF에 규칙이 있습니까?

모범 사례는 동적으로 코드의 리소스를 변경하려는 특정 이유가없는 한 정적 자원을 사용하는 것입니다. 동적 리 롤러스를 사용하려는 인스턴스의 또 다른 예에는 시스템 브러쉬, Systenfonts 및 시스템 매개 변수를 사용할 때 포함됩니다.

모든 답변이 유용하다고 생각했습니다. 단지 하나의 사용 사례를 추가하고 싶었습니다.

복합 WPF 시나리오에서 사용자 컨트롤은 해당 리소스를 DynamicResource로 언급하여 다른 부모 창/컨트롤 (이 사용자 제어를 호스팅하려면)에 정의 된 리소스를 사용할 수 있습니다.

다른 사람들이 언급했듯이 STATICRESOURCE는 컴파일 시간을 찾아 볼 것입니다. 사용자 컨트롤은 호스팅/부모 제어에서 정의 된 리소스를 언급 할 수 없습니다. 그러나이 경우 DynamicResource를 사용할 수 있습니다.

역동적 인 자원의 중요한 이점

애플리케이션 시작이 매우 오래 걸리면 동적 리소스를 사용해야합니다. 동적 리소스를 사용해야합니다. 창이나 앱이 생성 될 때 정적 리소스가 항상로드되기 때문에 동적 리소스가 항상로드되므로 동적 리소스가 처음 사용될 때로드됩니다.

그러나 자원이 매우 크고 복잡하지 않으면 어떤 혜택도 보지 못합니다.

동적 리소스는 설정중인 속성이 의존성 객체에서 파생 된 객체에 있거나 정적 자원이 어디에서나 사용할 수있는 경우 동결 가능성이있는 경우에만 사용할 수 있습니다. 정적 자원을 사용하여 전체 컨트롤을 추상화 할 수 있습니다.

정적 자원은 다음 상황에서 사용됩니다.

  1. 런타임시 반응 자원 변경이 필요하지 않은 경우.
  2. 많은 자원으로 좋은 성능이 필요하다면.
  3. 동일한 사전 내에서 자원을 참조하는 동안.

동적 리소스 :

  1. 속성 또는 스타일 세터 테마의 가치는 런타임까지 알려져 있지 않습니다.
    • 여기에는 시스템, 응시, 테마 기반 설정이 포함됩니다
    • 여기에는 앞으로의 참조도 포함됩니다.
  2. 페이지, Windows, UserControl로드시로드되지 않을 수있는 큰 자원을 참조하십시오.
  3. 사용자 정의 컨트롤에서 테마 스타일을 참조합니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top