C#/WPF

[WPF] ResourceDictionary

HJ0216 2024. 3. 18. 22:08

최근에 프로젝트를 진행하면서 ListView Control을 하며 어려웠던 부분을 정리하였습니다.

 

👉 기본 환경

- Language: C#, xaml

- IDE: Visual Basic 2022


Style을 ResourceDictionary에 선언해두고 필요한 파일에서만 적용하고 싶었는데, 

Resource의 key를 설정하는 부분에서 반나절 넘게 해멨습니다.

 

코드를 정리하고나니, 두 줄뿐이었지만 잊기 전에 다시 기록해둡니다.

 

ResourceDictionary

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<ResourceDictionary>
    <SolidColorBrush x:Key="PrimaryColor" Color="#FF0000"/>
    <Style x:Key="ScrollBarTrackThumb" TargetType="{x:Type Thumb}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Thumb}">
                    <Grid x:Name="Grid">
                        <Rectangle HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                                   Width="Auto" Height="Auto"
                                   Fill="Transparent" />
                        <Border x:Name="CornerScrollBarRectangle"
                                CornerRadius="5"
                                HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                                Width="Auto" Height="Auto"
                                Margin="0,1,0,1"
                                Background="{TemplateBinding Background}" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="Tag" Value="Horizontal">
                            <Setter TargetName="CornerScrollBarRectangle" Property="Width" Value="Auto" />
                            <Setter TargetName="CornerScrollBarRectangle" Property="Height" Value="6" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

 

Window / UserControl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<UserControl>
    <UserControl.Resources>
        <ResourceDictionary>
            <converter:BooleanToVisibleConverter x:Key="boolVisibleInverter"/>
            <RosourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Styles/CustomStyle.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    
    <!-- 생략 -->
 
    <!-- 암시적 스타일: TargetType="{x:Type Thumb}"에 따라 ScrollViewer에 Style 적용 -->
    <ScrollViewer>
        <!-- 명시적 스타일: ResourceDictionary 선언된 Key값 선언 -->
        <Grid Background="{StaticResource PrimaryColor}"></Grid>
    </ScrollViewer>
</UserControl>

 

* ResourceDictionary
    * 일반적으로 x:Key 없이 Resources 또는 ResourceDictionary.MergedDictionaries 내에서 직접 사용
    * 만일, 리소스 구별이 필요할 경우 x:Key 값을 설정해야 함
* ResourceDictionary.MergedDictionaries
    * 리소스를 전역적으로 적용할 목적으로 사용되므로 x:Key가 필요하지 않음
    * 여러 리소스 사전을 하나로 합치는 것이 목적

        → 각 리소스 사전 자체에 대한 키를 설정하는 것이 아니라, 그 안에 포함된 개별 리소스에 x:Key를 설정
        * ResourceDictionary로 연결하면, 개별 요소에서 key값을 통해 Style에 접근 가능