수색…
안녕하세요. 리소스
WPF는 매우 편리한 개념을 도입했습니다. 데이터를 리소스로 저장하는 기능입니다. 컨트롤을 위해 로컬로, 전체 창에 대해 로컬로 또는 전체 응용 프로그램에 대해 전역으로 저장합니다. 실제 정보에서부터 WPF 컨트롤의 계층에 이르기까지 원하는만큼 데이터를 사용할 수 있습니다. 이렇게하면 한 곳에서 데이터를 배치 한 다음 다른 곳에서 데이터를 사용할 수있어 매우 유용합니다.이 개념은 스타일과 템플릿에 많이 사용됩니다.
<Window x:Class="WPFApplication.ResourceSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ResourceSample" Height="150" Width="350">
<Window.Resources>
<sys:String x:Key="strHelloWorld">Hello, world!</sys:String>
</Window.Resources>
<StackPanel Margin="10">
<TextBlock Text="{StaticResource strHelloWorld}" FontSize="56" />
<TextBlock>Just another "<TextBlock Text="{StaticResource strHelloWorld}" />" example, but with resources!</TextBlock>
</StackPanel>
</Window>
리소스에는 StaticResource 태그 확장과 함께이 키를 사용하여 응용 프로그램의 다른 부분에서 참조 할 수있는 x : Key 특성을 사용하여 키가 제공됩니다. 이 예제에서는 간단한 문자열을 저장하고 두 개의 다른 TextBlock 컨트롤에서 사용합니다.
리소스 유형
간단한 문자열을 공유하는 것은 쉽지만 훨씬 더 많은 작업을 수행 할 수 있습니다. 이 예제에서는 배경에 사용되는 그라데이션 브러시와 함께 전체 문자열 배열을 저장합니다. 이렇게하면 리소스로 할 수있는 작업량을 알 수 있습니다.
<Window x:Class="WPFApplication.ExtendedResourceSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ExtendedResourceSample" Height="160" Width="300"
Background="{DynamicResource WindowBackgroundBrush}">
<Window.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
<x:Array x:Key="ComboBoxItems" Type="sys:String">
<sys:String>Item #1</sys:String>
<sys:String>Item #2</sys:String>
<sys:String>Item #3</sys:String>
</x:Array>
<LinearGradientBrush x:Key="WindowBackgroundBrush">
<GradientStop Offset="0" Color="Silver"/>
<GradientStop Offset="1" Color="Gray"/>
</LinearGradientBrush>
</Window.Resources>
<StackPanel Margin="10">
<Label Content="{StaticResource ComboBoxTitle}" />
<ComboBox ItemsSource="{StaticResource ComboBoxItems}" />
</StackPanel>
</Window>
이번에는 몇 가지 추가 리소스가 추가되어 이제 Window에 간단한 문자열, 문자열 배열 및 LinearGradientBrush가 포함됩니다. 문자열이 레이블에 사용되고 문자열 배열이 ComboBox 컨트롤의 항목으로 사용되며 그라디언트 브러시가 전체 창에 대한 배경으로 사용됩니다. 따라서 알 수 있듯이 거의 모든 것을 리소스로 저장할 수 있습니다.
로컬 및 응용 프로그램 전체 리소스
특정 컨트롤에 대해 특정 리소스 만 필요하면 해당 컨트롤을 창 대신 추가하여 로컬로 만들 수 있습니다. 이것은 정확히 똑같은 방식으로 작동합니다. 단지 컨트롤의 범위 내에서만 액세스 할 수 있다는 점만 다릅니다.
<StackPanel Margin="10">
<StackPanel.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
</StackPanel.Resources>
<Label Content="{StaticResource ComboBoxTitle}" />
</StackPanel>
이 경우 리소스를 StackPanel에 추가 한 다음 하위 컨트롤 인 Label에서 사용합니다. StackPanel 내부의 다른 컨트롤도이 자식 컨트롤의 자식이 액세스 할 수 있었던 것과 마찬가지로 사용할 수있었습니다. 이 특정 StackPanel 외부의 컨트롤은 액세스 할 수 없습니다.
여러 창에서 자원에 액세스하는 기능이 필요한 경우에도 가능합니다. App.xaml 파일은 창과 모든 종류의 WPF 컨트롤과 마찬가지로 리소스를 포함 할 수 있으며 App.xaml에 저장하면 프로젝트의 모든 창과 사용자 컨트롤에서 전역 적으로 액세스 할 수 있습니다. 윈도우에서 저장하고 사용할 때와 똑같은 방식으로 작동합니다.
<Application x:Class="WpfSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
StartupUri="WPFApplication/ExtendedResourceSample.xaml">
<Application.Resources>
<sys:String x:Key="ComboBoxTitle">Items:</sys:String>
</Application.Resources>
</Application>
WPF는 자동으로 로컬 컨트롤에서 창으로 이동 한 다음 App.xaml로 이동하여 지정된 리소스를 찾습니다.
<Label Content="{StaticResource ComboBoxTitle}" />
코드 숨김의 리소스
이 예에서는 Code-behind에서 서로 다른 세 가지 리소스에 액세스 할 것이며 각각 다른 범위에 저장됩니다.
App.xaml :
<Application x:Class="WpfSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
StartupUri="WPFApplication/ResourcesFromCodeBehindSample.xaml">
<Application.Resources>
<sys:String x:Key="strApp">Hello, Application world!</sys:String>
</Application.Resources>
</Application>
창문:
<Window x:Class="WpfSamples.WPFApplication.ResourcesFromCodeBehindSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="ResourcesFromCodeBehindSample" Height="175" Width="250">
<Window.Resources>
<sys:String x:Key="strWindow">Hello, Window world!</sys:String>
</Window.Resources>
<DockPanel Margin="10" Name="pnlMain">
<DockPanel.Resources>
<sys:String x:Key="strPanel">Hello, Panel world!</sys:String>
</DockPanel.Resources>
<WrapPanel DockPanel.Dock="Top" HorizontalAlignment="Center" Margin="10">
<Button Name="btnClickMe" Click="btnClickMe_Click">Click me!</Button>
</WrapPanel>
<ListBox Name="lbResult" />
</DockPanel>
</Window>
코드 숨김 :
using System;
using System.Windows;
namespace WpfSamples.WPFApplication
{
public partial class ResourcesFromCodeBehindSample : Window
{
public ResourcesFromCodeBehindSample()
{
InitializeComponent();
}
private void btnClickMe_Click(object sender, RoutedEventArgs e)
{
lbResult.Items.Add(pnlMain.FindResource("strPanel").ToString());
lbResult.Items.Add(this.FindResource("strWindow").ToString());
lbResult.Items.Add(Application.Current.FindResource("strApp").ToString());
}
}
}
보시다시피, 우리는 세 가지 "Hello, world!"를 저장합니다. 메시지 : App.xaml에 하나, 창에 하나, 메인 패널에 로컬로 하나. 인터페이스는 버튼과 ListBox로 구성됩니다.
코드 숨김에서는 버튼의 클릭 이벤트를 처리합니다.이 이벤트는 스크린 샷에서 볼 수 있듯이 각 텍스트 문자열을 ListBox에 추가합니다. 우리는 FindResource () 메서드를 사용합니다.이 메서드는 리소스를 개체 (있는 경우)로 반환 한 다음 ToString () 메서드를 사용하여 해당 문자열로 변환합니다.
다른 범위에서 FindResource () 메서드를 사용하는 방법에 주목하십시오. 먼저 패널에서, 다음에 창에서 현재 Application 개체로 이동합니다. 우리가 알고있는 리소스를 찾는 것은 의미가 있지만, 이미 언급했듯이 리소스가 발견되지 않으면 검색이 계층 구조 위로 진행되므로 원칙적으로 다음과 같은 패널에서 FindResource () 메서드를 사용할 수 있습니다. 모든 세 가지 경우는 창과 창에서 응용 프로그램 수준까지 계속 유지되었으므로 발견되지 않습니다.
검색은 트리를 탐색하지 않으므로 컨트롤이나 창에 대해 로컬로 정의 된 경우 응용 프로그램 수준에서 리소스를 찾을 수 없습니다.