티스토리 뷰

WPF .NET

ResourceDictionary 사용하기 (활용편)

Connor Park 2022. 2. 11. 10:00
반응형

리소스 딕셔너리는 WPF 내부에서 사용할 수 있는 거의 모든 자원들을 인스턴스 시켜서 사용할 수 있습니다.

여러가지 활용 사례를 살펴 보도록 하겠습니다.

 

0. 한계

리소스 딕셔너리 파일 하나의 크기는 5000라인을 넘기지 않는 것이 좋습니다. 5000라인이 넘어가면 리소스를 처리하는데 성능지연이 발생합니다. 그래서, 5000라인 이하의 리소스 딕셔너리 파일 여러개를 사용하는 것이 좋습니다.

1. SolidColorBrush

코드로 SolidColorBrush를 생성해서 사용할 수도 있지만, 리소스로 하나를 만들어 놓고 모든 화면에서 활용할 수도 있습니다.

    <SolidColorBrush x:Key="WhiteBrush" Color="White" />
    <SolidColorBrush x:Key="RedBrush" Color="Red" />
    <SolidColorBrush x:Key="BlueBrush" Color="Blue" />

2. BitmapImage

이미지를 BitmapImage 리소스로 등록한 후에 여러 화면에서 호출해서 사용할 수 있습니다. 사용시 유의 사항은 BitmapImage 리소스로 만들면 이미지의 크기 만큼 메모리를 사용하기 때문에, 적당히 사용해야 합니다. 

 

이미지를 프로젝트에 추가한 후에 속성에서 Build Action을 Content로 설정하고, Copy to Output Directory를 Copy if newer 정도로 변경하고, 아래 코드를 입력합니다.

XDG0062 Specified value of type 'System.Windows.Media.Imaging.BitmapImage' must have IsFrozen set to false to modify.
이 에러는 Build Action이 Content가 아닌 경우에 발생합니다.

<BitmapImage x:Key="BitmapMara" UriSource="/Images/mara's kaleidoscope.png" />

3. System type

일반 문자열 및 모든 system type들도 리소스로 만들어서 사용할 수 있습니다. StringFormat을 리소스로 등록해 놓고 사용하는 경우도 있습니다. 

문자열 리소스를 이용해서 다국어 처리를 하는 경우도 있습니다. (프로그램이 큰 경우에는 비추천입니다.)

<system:String x:Key="DateFormatString">{0:D}</system:String>

4. 클래스의 인스턴스 객체

일반 클래스도 인스턴스 시켜서 리소스로 등록해 놓고 사용할 수 있습니다. 

    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public bool Sex { get; set; }
        public string Phone { get; set; }
    }
    <local:Person
        x:Key="kaki104Person"
        Name="kaki104"
        Id="1"
        Phone="010-1111-2222"
        Sex="True" />

5. DataTemplate

여러 화면에서 사용하는 DataTemplate도 리소스로 만들어 놓고, 같이 사용하면 개발할 때 편리합니다.

    <DataTemplate x:Key="HeaderTemplate">
        <Border Background="{StaticResource BlueBrush}">
            <TextBlock Foreground="{StaticResource WhiteBrush}" Text="{Binding}" />
        </Border>
    </DataTemplate>

6. 사용 예제

<Window
    x:Class="ResourceDictionarySample2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:ResourceDictionarySample2"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    mc:Ignorable="d">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <StackPanel>
            <TextBlock Style="{StaticResource TitleTextBlock}" Text="Hello Resource Dictionary2" />
            <Border Background="{StaticResource RedBrush}">
                <TextBlock Foreground="{StaticResource WhiteBrush}" Text="Item1" />
            </Border>
            <TextBlock Foreground="{StaticResource RedBrush}" Text="Item2" />
            <Image Source="{StaticResource BitmapMara}" />
        </StackPanel>
        <StackPanel Grid.Column="1" Margin="10,0">
            <HeaderedContentControl
                Content="{Binding Source={StaticResource kaki104Person}, Path=Id}"
                FontSize="20"
                Header="Id"
                HeaderTemplate="{StaticResource HeaderTemplate}" />
            <HeaderedContentControl
                Content="{Binding Source={StaticResource kaki104Person}, Path=Name}"
                FontSize="20"
                Header="Name"
                HeaderTemplate="{StaticResource HeaderTemplate}" />
            <HeaderedContentControl
                Content="{Binding Source={StaticResource kaki104Person}, Path=Sex}"
                FontSize="20"
                Header="Sex"
                HeaderTemplate="{StaticResource HeaderTemplate}" />
            <HeaderedContentControl
                Content="{Binding Source={StaticResource kaki104Person}, Path=Phone}"
                FontSize="20"
                Header="Phone"
                HeaderTemplate="{StaticResource HeaderTemplate}" />
        </StackPanel>
    </Grid>
</Window>

 

7. 소스

WpfTest/ResourceDictionarySample2 at master · kaki104/WpfTest · GitHub

 

GitHub - kaki104/WpfTest

Contribute to kaki104/WpfTest development by creating an account on GitHub.

github.com

 

반응형
댓글
댓글쓰기 폼
반응형
Total
689,181
Today
227
Yesterday
434
«   2022/07   »
          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 29 30
31            
07-07 17:37
글 보관함