본문 바로가기
C#/WPF

[WPF] Static Resource와 Dynamic Resource

by HJ0216 2024. 4. 20.

WPF를 학습하며 헷갈렸던 부분을 정리해두었습니다.

 

👉 기본 환경

- Language: C#, xaml

- IDE: Visual Basic 2022

- Framework: .NET 8.0


WPF에서 Resource는 크게 2가지가 있습니다.

Static Resource와 Dynamic Resource

 

저는 주로 ResourceDictionary를 사용하면 Window에서 Dictionary를 선언하고 Static으로 사용합니다.

그런데 이번에 토글버튼을 통해 테마를 변경해보며 DynamicResource를 사용하게 되어 간단하게 차이점을 정리해보고자 합니다.

 

StaticResource

 *  컴파일 시 리소스 바인딩

 * 즉, 애플리케이션이 로드될 때 한 번 리소스를 찾아서 적용하고, 그 이후에는 리소스의 변경을 반영하지 않음

 * 성능 측면에서 실행 시에 리소스를 찾기위한 추가적인 계산이나 검색을 수행할 필요가 없 DynamicResource보다 효율적

 

DynamicResource

 * 실행 시간에 리소스를 찾아 바인딩

 * 리소스 참조가 실행 시간에 이루어지기 때문에, 참조하는 리소스가 초기에는 없다가 나중에 추가 가능

 

따라서, 리소스가 변경될 일이 없고 성능이 중요할 경우에는 Static을

리소스가 변경될 가능성이 있거나 로드 시에는 리소스가 없으나 실행 중 리소스가 생길 경우에는 Dynamic을 사용

 

✍️ 예시

View

1
2
3
4
5
6
7
8
9
10
11
12
13
<Window x:Class="SwitchThemes.MainWindow">
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Styles/DictionaryMainStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>
 
    <Grid Background="{DynamicResource backgroundBlack}">
        <!-- 생략 -->
    </Grid>
</Window>

 

ViewModel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void ChangeTheme()
{
    if (IsLightMode)
    {
        AppTheme.ChangeTheme(new Uri("/Styles/DictionaryThemeWhite.xaml", UriKind.Relative));
        ThemeMode = "Light";
        return;
    }
 
    if (!IsLightMode)
    {
        AppTheme.ChangeTheme(new Uri("/Styles/DictionaryThemeBlack.xaml", UriKind.Relative));
        ThemeMode = "Dark";
        return;
    }
}

 

⭐ Grid의 Backgound 속성이 다음과 같이 Checked 여부에 따라 변경되는 경우라면, StaticResource가 아닌 Dynamic Resource를 사용해야 함

 

'C# > WPF' 카테고리의 다른 글

[WPF] 생성자 Override  (1) 2024.04.27
[WPF] 한글 Encoding ANSI / UTF8  (0) 2024.04.22
[WPF] MaterialDesignTheme 적용  (0) 2024.04.13
[WPF] WebView2와 동영상  (0) 2024.04.13
[WPF] Button 클릭 영역과 Background  (0) 2024.04.06