티스토리 뷰

C#/WPF

WPF tutorial - Resource

광그로 2017. 6. 20. 16:20

리소스 http://www.wpf-tutorial.com/wpf-application/resources/


데이터를 리소스로서 control을 위해서는 local로, 전체 window를 위해서 local 또는 global로 저장이 가능합니다.

데이터는 실제 정보에서 wpf 컨트롤 계층 구조까지 원하는 것이 무엇이든지 될 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<Window x:Class="WPF_tutorial.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_tutorial"
        xmlns:system="clr-namespace:System;assembly=mscorlib" 이 부분을 필수로 추가시켜주어야 합니다.
        mc:Ignorable="d"
        Title="MainWindow" Height="150" Width="350">

    <Window.Resources>
        <system:String x:Key="strHelloWorld">Hello, world!</system:String>
리소스를 x:Key(attribute)를 이용하여 key값이 부여해라.
    </Window.Resources>
    <StackPanel Margin="10">
        <TextBlock Text="{StaticResource strHelloWorld}" FontSize="56" />
TextBlock은 STaticResource가 strHelloWold인 리소스를 사용, FontSize를 56의 속성을 부여해라.
        <TextBlock>Just another "<TextBlock Text="{StaticResource strHelloWorld}" />" example, but with resources!</TextBlock>
    </StackPanel>
</Window>
cs




StaticResource vs DynamicResource

StaticResource의 경우 태그의 확장을 이용하여 리소스를 참조하였습니다.


StaticResource는 XAML의 load time에 한 번만 해결된다는 것입니다. 나중에 리소스를 변경하면 다른 곳에서는 변경 사항이 반영되지 않습니다.

DynamicResource의 경우, 리소스가 변경되면 해당 변경사항이 적용됩니다.



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
<Window x:Class="WPF_tutorial.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_tutorial"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="150" Width="350"
        Background="{DynamicResource WindowBackgroundBrush}">
  추가해주어야한다!
<Window.Resources>
        <system:String x:Key="ComboBoxTitle">Items:</system:String>
 
        <x:Array x:Key="ComboBoxItems" Type="system:String">
string type의 배열을 만들어라.
           <system:String>Item #1</system:String>
            <system:String>Item #2</system:String>
            <system:String>Item #3</system:String>
        </x:Array>
 
        <LinearGradientBrush x:Key="WindowBackgroundBrush">
key값은 WindowBackgroundBrush로 하고, silver와 gray로 그라데이션을 부여해라.
<GradientStop Offset="0" Color="Silver"/>
            <GradientStop Offset="1" Color="Gray"/>
        </LinearGradientBrush>
    </Window.Resources>
 
    <StackPanel Margin="10">
        <Label Content="{StaticResource ComboBoxTitle}" />
string을 label에 사용해라.
        <ComboBox ItemsSource="{StaticResource ComboBoxItems}" />
string 배열을 ComboBox control의 항목으로 사용해라.
    </StackPanel>
cs



window 전체에서 리소스에 액세스 할 수 있다.







1
2
3
4
5
6
<Window.Resources>
<system:String x:Key="ComboBoxTitle">Items:</system:String>
는 제거


<StackPanel Margin="10">
    <StackPanel.Resources>
        <system:String x:Key="ComboBoxTitle">Items:</system:String>
리소스를 StackPanel에 추가, 하위 control인 label에서 사용
    </StackPanel.Resources>
    <Label Content="{StaticResource ComboBoxTitle}" />
</StackPanel>
cs


App.xaml는 프로젝트의 window, control에 모두 액세스할 수 있습니다.



1
2
3
4
5
6
7
8
9
10
11
App.xaml

<Application x:Class="WPF_tutorial.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPF_tutorial"
             StartupUri="MainWindow.xaml"
             xmlns:system="clr-namespace:System;assembly=mscorlib">
    
    <Application.Resources>
        <system:String x:Key="ComboBoxTitle">Items:</system:String>
    </Application.Resources>
</Application>
cs
1
2
3
4
5
6
MainWindow.xaml
 
<StackPanel Margin="10">
        <Label Content="{StaticResource ComboBoxTitle}" />
        <ComboBox ItemsSource="{StaticResource ComboBoxItems}"/>
 </StackPanel>
cs



Code-behind 리소스

위의 경우 XAML에서 직접 리소스에 액세스하였습니다. 그러나 cod-behind에서도 리소스에 액세스할 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
App.xaml

<Application x:Class="WPF_tutorial.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WPF_tutorial"
             StartupUri="MainWindow.xaml"
             xmlns:system="clr-namespace:System;assembly=mscorlib">
    
    <Application.Resources>
        <system:String x:Key="strApp">Hello, Application world!</system:String>
App의 리소스의 key값을 strApp로, 내용을 Hello, Application world!로.
    </Application.Resources>
</Application>
 
cs

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
MainWindow.xaml

<Window x:Class="WPF_tutorial.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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_tutorial"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        mc:Ignorable="d"
        Title="MainWindow" Height="150" Width="350">
 
    <Window.Resources>
        <system:String x:Key="strWindow">Hello, Window world!</system:String>
Window의 리소스의 key값을 strWindow로, 내용을 Hello, Window world!로.
    </Window.Resources>
 
    <DockPanel Margin="10" Name="pnlMain">
        <DockPanel.Resources>
            <system:String x:Key="strPanel">Hello, Panel world!</system:String>
Panel의 리소스의 key값을 strPanel로, 내용을 Hello, Panel world!로.
        </DockPanel.Resources>
 
        <WrapPanel DockPanel.Dock="Top" HorizontalAlignment="Center" Margin="10">
            <Button Name="btnClickMe" Click="btnClickMe_Click">Click_me</Button>
        </WrapPanel>
 
        <ListBox Name="lbResult"></ListBox>
    </DockPanel>
 
</Window>
 

cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MainWindow.xaml.cs

namespace WPF_tutorial
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window 
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void btnClickMe_Click(object sender, RoutedEventArgs e)
        {
FindResource()(method)를 이용하여, 리소스를 발견할 경우, 객체로 반환하고,
Tostring()(method)를 이용해서 문자열로 변환하여라.
            lbResult.Items.Add(pnlMain.FindResource("strPanel").ToString());
            lbResult.Items.Add(this.FindResource("strWindow").ToString());
            lbResult.Items.Add(Application.Current.FindResource("strApp").ToString());
        }
    }
}



cs



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

WPF tutorial - The TextBlock control  (0) 2017.06.20
WPF tutorial - Handling exceptions in WPF  (0) 2017.06.20
WPF tutorial - Command-line parameters in WPF  (2) 2017.06.20
WPF tutorial - App.xaml로 작업하기  (0) 2017.06.20
WPF tutorial - window  (0) 2017.06.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함