[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

WPF 응용 프로그램 Resource, Content 그리고 Data Files

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:      }  

댓글

이 블로그의 인기 게시물

[C#] Task 완료 시 다른 Task를 자동으로 수행

[C#] 태스크(Task)가 완료될 때 까지 대기하여 결과를 얻는 방법

[C#] 명시적으로 Task 생성 및 실행