WPF 응용 프로그램 Resource, Content 그리고 Data Files
WPF (Windows Presentation Foundation)는 응용 프로그램 데이터 파일(이미지, 비디오 등)이라고하는 이러한 유형의 데이터 파일을 구성, 식별 및 사용하는 특수 지원을 제공합니다.
- Resource Files : 실행 파일 또는 라이브러리 WPF 어셈블리로 컴파일되는 데이터 파일입니다.
- Content Files : 실행 가능한 WPF 어셈블리와 관련성이있는 독립 실행 형 데이터 파일입니다.
- Site of Origin Files : 실행 가능한 WPF 어셈블리와 관련이없는 독립 실행 형 데이터 파일.
이 세가지 유형의 파일간에 중요한 차이점 중 하나는 빌드시에 어셈블리가 Resource Files와 Content Files은 알 수 있다는 것입니다. 그러나 Site of Origin Files의 경우는 어셈블리가 모르거나, 참조 된 원본 파일이 실제로 존재한다는 보장이 없습니다.
Resource Files
응용 프로그램 데이터 파일을 항상 응용 프로그램에서 사용할 수 있어야하는 경우 가용성을 보장하는 유일한 방법은 응용 프로그램의 주 실행 가능 어셈블리 또는 참조 된 어셈블리 중 하나에 컴파일하는 것입니다. 이 유형의 응용 프로그램 데이터 파일을 Resource Files 이라고 합니다.
다음 경우에 리소스 파일을 사용해야합니다.
- 어셈블리로 컴파일 된 후 리소스 파일의 내용을 업데이트 할 필요가 없습니다.
- 파일 종속성의 수를 줄임으로써 응용 프로그램 배포의 복잡성을 단순화하고자합니다.
- 응용 프로그램 데이터 파일을 지역화 할 수 있어야합니다.
! 노트
이 섹션에서 설명하는 리소스 파일은 XAML 리소스 에서 설명한 리소스 파일 과는 다르며 .NET(응용 프로그램 리소스 관리)에 설명 된 포함 된 리소스 와는 다릅니다 .
Resource Files 구성
WPF 프로젝트를 생성한 후 솔루션 탐색기를 이용해 프로젝트 하위에 Images 폴더를 생성한 후 이미지를 추가 합니다. 저는 button.png 파일을 추가 했습니다.
button.png의 속성 창에서 빌드 작업을 Resource로 지정 합니다.
Resource Files 사용
리소스 파일을 로드 하려면 Application 클래스 의 GetResourceStream 메서드를 호출 하고 원하는 리소스 파일을 식별하는 URI를 전달합니다. GetResourceStream 은 리소스 파일을 Stream 으로 제공하고 해당 콘텐츠 형식을 설명 하는 StreamResourceInfo 개체를 반환합니다.
이 예제는 두 개의 버튼이 있고 버튼 클릭 시 리소스 이미지를 클릭 된 버튼의 Content 속성에 설정 합니다.
1: <Window x:Class="BinaryResources.MainWindow"
2: xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4: xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5: xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6: xmlns:local="clr-namespace:BinaryResources"
7: mc:Ignorable="d"
8: Title="MainWindow" Height="350" Width="525">
9: <Grid>
10: <Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="194,73,0,0" VerticalAlignment="Top" Width="75" Click="button_Click"/>
11: <Button x:Name="button1" Content="Button" HorizontalAlignment="Left" Margin="194,124,0,0" VerticalAlignment="Top" Width="75" Click="button1_Click"/>
12: </Grid>
13: </Window>
- GetResourceStream 메서드를 호출하여 Resource Load
1: private void button_Click(object sender, RoutedEventArgs e)
2: {
3: // 이미지 리소스 파일 읽어오기
4: Uri uri = new Uri("/images/button.png", UriKind.Relative);
5: StreamResourceInfo info = Application.GetResourceStream(uri);
6: BitmapFrame br = BitmapFrame.Create(info.Stream);
7: Image image = new Image();
8: image.Source = br;
9: button.Content = image;
10: }
- Stream을 변환하는 추가 작업을 생략하여 Resource Load
1: private void button1_Click(object sender, RoutedEventArgs e)
2: {
3: Uri uri = new Uri("/images/button.png", UriKind.Relative);
4: BitmapImage bitmapImage = new BitmapImage(uri);
5: Image image = new Image();
6: image.Source = bitmapImage;
7: button1.Content = image;
8: }
- 위 예제와 동일한 XAML 마크업
1: <Button x:Name="button2" HorizontalAlignment="Left" Margin="194,186,0,0" VerticalAlignment="Top" Width="75">
2: <Button.Content>
3: <Image Source="Images/button.png" />
4: </Button.Content>
5: </Button>
Content Files
응용 프로그램에서 해당 응용 프로그램 데이터 파일을 사용하는 어셈블리를 다시 컴파일하지 않고 업데이트 할 수 있도록 특정 응용 프로그램 데이터 파일 집합이 필요한 경우에는 Content Files을 사용해야합니다.
Content Files 구성
콘텐츠 파일을 프로젝트에 추가하려면 응용 프로그램 데이터 파일을 Content항목 으로 포함해야합니다.
Content Files 사용
- GetContentStream 메서드를 호출하여 Resource Load
1: private void button3_Click(object sender, RoutedEventArgs e)
2: {
3: Uri uri = new Uri("/images/button2.png", UriKind.Relative);
4: StreamResourceInfo info = Application.GetContentStream(uri);
5: BitmapFrame br = BitmapFrame.Create(info.Stream);
6: Image image = new Image();
7: image.Source = br;
8: button3.Content = image;
9: }
- Stream을 변환하는 추가 작업을 생략하여 Resource Load
1: private void button4_Click(object sender, RoutedEventArgs e)
2: {
3: Uri uri = new Uri("/images/button2.png", UriKind.Relative);
4: BitmapImage bitmapImage = new BitmapImage(uri);
5: Image image = new Image();
6: image.Source = bitmapImage;
7: button4.Content = image;
8: }
Site of Origin Files
어셈블리와 응용 프로그램 데이터 파일 간의 암시적 또는 비존재 관계를 설정하고자 할 수 있습니다.
- 파일이 컴파일 할 때 존재하지 않습니다.
- 런타임까지 어셈블리에 필요한 파일을 알 수 없습니다.
- 연관된 어셈블리를 다시 컴파일하지 않고 파일을 업데이트하려고 할 수 있습니다.
- 응용 프로그램은 오디오 및 비디오와 같은 대용량 데이터 파일을 사용하므로 사용자가 원하는 경우에만 사용자가 다운로드하도록 할 수 있습니다.
file:/// 및 http:// schemes와 같은 기존 URI 스키마를 사용하여 이러한 유형의 파일을로드 할 수 있습니다.
1: <Image Source="file:///C:/DataFile.bmp" />
2: <Image Source="http://www.datafilewebsite.com/DataFile.bmp" />
Site of Origin Files 구성
빌드 작업을 [없음]으로 설정하고, 출력 디렉터리에 복사를 [항상 복사]로 설정 합니다.
Site of Origin Files 사용
Site Of Origin File를 로드하려면 원하는 Site Of Origin File를 식별하는 pack URI를 전달 하여 Application 클래스 의 GetRemoteStream 메서드를 호출하면 됩니다.
- GetRemoteStream 메서드를 호출하여 Resource Load
1: private void button5_Click(object sender, RoutedEventArgs e)
2: {
3: Uri uri = new Uri("/images/button3.png", UriKind.Relative);
4: StreamResourceInfo info = Application.GetRemoteStream(uri);
5: BitmapFrame br = BitmapFrame.Create(info.Stream);
6: Image image = new Image();
7: image.Source = br;
8: button5.Content = image;
9: }
- Stream을 변환하는 추가 작업을 생략하여 Resource Load
1: private void button6_Click(object sender, RoutedEventArgs e)
2: {
3: Uri uri = new Uri("pack://siteoforigin:,,,/images/button3.png", UriKind.Absolute);
4: BitmapImage bitmapImage = new BitmapImage(uri);
5: Image image = new Image();
6: image.Source = bitmapImage;
7: button6.Content = image;
8: }
댓글
댓글 쓰기