WPF의 Static Resource와 Dynamic Resource의 차이점은 무엇입니까?
WPF에서 브러시, 템플릿, 스타일 등의 리소스를 사용하는 경우 Static Resources로 지정할 수 있습니다.
<Rectangle Fill="{StaticResource MyBrush}" />
또는 Dynamic Resource로서
<ItemsControl ItemTemplate="{DynamicResource MyItemTemplate}" />
대부분의 경우(항상?) 한쪽만 작동하고 다른 한쪽은 런타임 중에 예외를 발생시킵니다.하지만 그 이유를 알고 싶습니다.
- 가장 큰 차이점은 무엇입니까?메모리나 퍼포먼스에 대한 영향과 유사
- WPF에는 "brush is always static" 및 "templates is always dynamic" 등의 규칙이 있습니까?
스태틱과 다이내믹 중 어느 쪽을 선택할지는 생각만큼 자의적이지 않을 것 같은데...패턴을 볼 수 없어요
애플리케이션이 실제로 실행되기 전에 발생하는 XAML 로드 중에 Static Resource가 해결되어 속성에 할당됩니다.리소스 사전의 변경은 무시되고 한 번만 할당됩니다.
DynamicResource는 로드하는 동안 Expression 개체를 속성에 할당하지만 Expression 개체가 값을 요청할 때까지 실제로 리소스를 조회하지 않습니다.그러면 런타임에 필요할 때까지 리소스 조회가 지연됩니다.좋은 예로는 나중에 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>
여기에서는 버튼과 창에 동적 리소스를 사용했지만 어디에도 이를 선언하지 않았습니다.실행 시 계층의 ResourceDictionary가 체크됩니다.아직 정의하지 않았기 때문에 기본값이 사용될 것입니다.
Button 이벤트를 클릭하기 위해 아래 코드를 추가하면 Dynamic Resource를 사용하기 때문에 그에 따라 배경이 업데이트됩니다.
private void ButtonNew_Click(object sender, RoutedEventArgs e)
{
this.Resources.Add( "PinkBrush"
,new SolidColorBrush(SystemColors.DesktopColor)
);
}
Static Resource를 사용한 경우:
- 리소스는 XAML로 선언해야 합니다.
- 또, 「전」에도 사용되고 있습니다.
혼돈은 없길 바라네
스태틱 리소스
동적 자원
- Static Resource는 첫 번째 값을 사용합니다.Dynamic Resource는 마지막 값을 사용합니다.
- Dynamic Resource는 중첩된 스타일링에 사용할 수 있지만 Static Resource는 사용할 수 없습니다.
이 중첩된 스타일 사전이 있다고 가정합니다.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>
표시 중:
<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>
Static Resource는 버튼을 스타일에서 발견된 첫 번째 값인 LightGreen으로 렌더링합니다.Dynamic Resource는 그리드를 렌더링할 때 LightGreen 버튼을 Pink로 덮어씁니다.
Resource(스태틱 리소스)
Dynamic Resource( 자원)
VS Designer는 DynamicResource를 StaticResource로 취급합니다.그것은 첫 번째 가치를 얻을 것이다.이 경우 VS Designer는 버튼을 LightGreen으로 렌더링하지만 실제로는 Pink가 됩니다.
루트 레벨 스타일(LightGreen)을 제거하면 StaticResource에서 오류가 발생합니다.
가장 큰 차이점은 무엇입니까?메모리나 퍼포먼스에 대한 영향과 유사
정적 리소스와 동적 리소스의 차이는 기본 개체가 변경될 때 발생합니다.리소스 컬렉션에 정의된 브러시가 코드로 액세스되고 다른 개체 인스턴스로 설정된 경우 Rectangle은 이 변경을 감지하지 않습니다.
정적 리소스는 요소를 참조하여 한 번 검색하여 리소스 수명 동안 사용되었습니다.한편, Dynamic Resources 는 사용할 때마다 취득합니다.
동적 리소스의 단점은 애플리케이션 성능이 저하되는 경향이 있다는 것입니다.
WPF에는 "brush is always static" 및 "templates is always dynamic" 등의 규칙이 있습니까?
코드의 리소스를 동적으로 변경하는 것과 같은 특별한 이유가 없는 한 정적 리소스를 사용하는 것이 좋습니다.다이내믹 리소스를 사용하지 않는 다른 예로는 SystemBrushes, SystenFonts 및 System Parameters를 사용하는 경우를 들 수 있습니다.
모든 답변이 유용하다는 것을 알았고, 사용 사례를 하나 더 추가하고자 했습니다.
복합 WPF 시나리오에서는 사용자 컨트롤이 다른 부모 창/컨트롤(이 사용자 컨트롤을 호스트하는 경우)에 정의된 리소스를 DynamicResource라고 부릅니다.
다른 사용자가 언급했듯이 정적 리소스는 컴파일 시 조회됩니다.사용자 컨트롤은 호스팅/상위 컨트롤에 정의된 리소스를 참조할 수 없습니다.단, 이 경우 Dynamic Resource를 사용할 수 있습니다.
동적 자원의 중요한 이점
응용 프로그램 시작 시간이 매우 오래 걸리는 경우 동적 리소스를 사용해야 합니다. 정적 리소스는 창이나 앱을 만들 때 항상 로드되지만 동적 리소스는 처음 사용할 때 로드되기 때문입니다.
그러나 리소스가 매우 크고 복잡하지 않으면 이점을 얻을 수 없습니다.
동적 리소스는 설정 중인 속성이 종속성 개체에서 파생된 개체 또는 고정 가능한 개체에 있는 경우에만 사용할 수 있습니다. 여기서 정적 리소스는 어디에서나 사용할 수 있습니다.정적 리소스를 사용하여 전체 제어를 추상화할 수 있습니다.
정적 리소스는 다음과 같은 상황에서 사용됩니다.
- 런타임에 대응 리소스를 변경할 필요가 없는 경우.
- 많은 리소스로 좋은 퍼포먼스가 필요한 경우.
- 동일한 사전에서 리소스를 참조하는 동안.
동적 리소스:
- 속성 또는 스타일 설정자 테마의 값은 런타임까지 알 수 없습니다.
- 여기에는 시스템, 복제, 테마 기반 설정이 포함됩니다.
- 여기에는 전달 참조도 포함됩니다.
- 페이지, 창, 사용자 컨트롤이 로드될 때 로드되지 않을 수 있는 대규모 리소스를 참조합니다.
- 사용자 정의 컨트롤에서 테마 스타일 참조.
언급URL : https://stackoverflow.com/questions/200839/whats-the-difference-between-staticresource-and-dynamicresource-in-wpf
'programing' 카테고리의 다른 글
단순 vba 코드가 실행 시간 오류 91 개체 변수를 제공하거나 블록이 설정되지 않은 경우 (0) | 2023.04.22 |
---|---|
셸 프로그래밍에서 $(command)와 command의 차이점은 무엇입니까? (0) | 2023.04.22 |
이동에서 문자열을 정수 형식으로 변환하시겠습니까? (0) | 2023.04.22 |
WPF DataBinding: Nullable Int에서도 검증 오류가 발생합니까? (0) | 2023.04.22 |
Xcode 8은 프로비저닝 프로파일에 서명 인증서가 포함되어 있지 않다는 오류를 나타냅니다. (0) | 2023.04.22 |