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에 접근 가능