[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...

MSDN WPF 샘플 따라하기 - IntroToStylingAndTemplating

IntroToStylingAndTemplating

이 샘플은 스타일을 사용하여 시각적으로 매력적인 사용자 환경을 만드는 방법을 보여주기 위해 디자인 된 간단한 사진 응용 프로그램입니다.

Pohoto Class

이미지 경로를 가지는 모델 클래스를 정의 합니다.

1:    public class Photo  
2:    {  
3:      public Photo(string path)  
4:      {  
5:        Source = path;  
6:      }  
7:      public string Source { get; }  
8:      public override string ToString()  
9:      {  
10:        return Source;  
11:      }  
12:    }  

PhotoList Class

속성 변경 시 알림 제공을 위해 ObservableCollection<T> 클래스를 상속 받는 Collection을 정의 합니다. PhotoList 클래스는 디렉토리가 경로가 설정 될 때 경로의 jpg파일을 갱신 합니다.

1:    public class PhotoList : ObservableCollection<Photo>  
2:    {  
3:      private DirectoryInfo _directory;  
4:      public PhotoList()  
5:      { }  
6:      public PhotoList(string path) : this(new DirectoryInfo(path)) { }  
7:      public PhotoList(DirectoryInfo directory)  
8:      {  
9:        _directory = directory;  
10:        Update();  
11:      }  
12:      public string Path  
13:      {  
14:        set  
15:        {  
16:          _directory = new DirectoryInfo(value);  
17:          Update();  
18:        }  
19:        get { return _directory.FullName; }  
20:      }  
21:      private void Update()  
22:      {  
23:        foreach (var f in _directory.GetFiles("*.jpg"))  
24:        {  
25:          Add(new Photo(f.FullName));  
26:        }  
27:      }  
28:    }  

Window.Loaded 이벤트

ObjectDataProvider를 Window.Resources로 선언하고 비하인드 코으에서 ObjectDataProvider를 검색하여 프로젝트의 바이너리 리소스의 상대 경로를 지정 합니다. 이 때 해당 경로의 *.jpg 파일을 모두 읽어 Photo 객체를 생성 및 추가 합니다.

1:    <Window.Resources>  
2:      <ObjectDataProvider x:Key="MyPhotos" ObjectType="{x:Type local:PhotoList}" />  
3:    </Window.Resources>  

1:      private void Window_Loaded(object sender, RoutedEventArgs e)  
2:      {  
3:        // XAML에 정의된 ObjectDataProvider를 가져 옵니다.  
4:        _photos = (PhotoList)(Resources["MyPhotos"] as ObjectDataProvider).Data;  
5:        _photos.Path = @"..\..\Images";  
6:      }  

1:  <StackPanel Margin="10">  
2:      <TextBlock Name="textblock1">My Pictures</TextBlock>  
3:      <TextBlock>Check out my new pictures!</TextBlock>  
4:      <ListBox ItemsSource="{Binding Source={StaticResource MyPhotos}}"  
5:           Background="White" Width="600" Margin="10" SelectedIndex="0" />  
6:    </StackPanel>  

바인딩 결과
이 예제는 이미지가 ListBoxItem으로 추가 되어야 하지만 Photo 클래스의 ToString 메소드를 암시적으로 호출 하는 것을 볼 수 있습니다.

DataTemplate

ItemsControl을 상속하는 Control은 DataTemplate를 이용해 Item의 모양을 사용자 정의 할 수 있습니다. 이 예제는 Photo.Path 속성을 이용해 이미지를 표현 합니다.

1:      <!-- 경로의 텍스트 문자열 대신 이미지로 이미지를 표시하는 DataTemplate -->  
2:      <DataTemplate DataType="{x:Type local:Photo}">  
3:        <Border Margin="3">  
4:          <Image Source="{Binding Source}" />  
5:        </Border>  
6:      </DataTemplate>  

바인딩 결과

TextBlock Style 적용

Control 형식 지정을 통해 Style을 적용하거나, Style의 Key를 이용해 명시적으로 설정할 수 있습니다. 이 예제는 위에 설명한 두 방법과 Style 상속을 적용하는 부분도 볼 수 있습니다.

Style TextBlock 타입 지정

1:      <!-- 모든 TextBlocks에 영향을주는 스타일 -->  
2:      <Style TargetType="TextBlock">  
3:        <Setter Property="HorizontalAlignment" Value="Center" />  
4:        <Setter Property="FontFamily" Value="Comic Sans MS" />  
5:        <Setter Property="FontSize" Value="14" />  
6:      </Style>  

Style TextBlock 타입 상속

1:      <!-- 이전 TextBlock 스타일을 확장하는 스타일 -->  
2:      <!-- 이것은 TitleText의 x : Key가있는 "명명 된 스타일"입니다. -->  
3:      <Style BasedOn="{StaticResource {x:Type TextBlock}}"  
4:          TargetType="TextBlock"  
5:          x:Key="TitleText">  
6:        <Setter Property="FontSize" Value="26" />  
7:        <Setter Property="Foreground">  
8:          <Setter.Value>  
9:            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">  
10:              <LinearGradientBrush.GradientStops>  
11:                <GradientStop Offset="0.0" Color="#90DDDD" />  
12:                <GradientStop Offset="1.0" Color="#5BFFFF" />  
13:              </LinearGradientBrush.GradientStops>  
14:            </LinearGradientBrush>  
15:          </Setter.Value>  
16:        </Setter>  
17:      </Style>  

Style 적용

1:      <TextBlock Style="{StaticResource TitleText}" Name="textblock1">My Pictures</TextBlock>  
2:      <TextBlock>Check out my new pictures!</TextBlock>  

TextBlock Style 적용

ListBox ControlTemplate 

Style을 이용해 ControlTemplate를 사용자 정의 하여 ListBoxItem을 수평으로 정렬하도록 합니다.

1:      <!-- 가로 ListBox 컨트롤 템블릿-->  
2:      <Style TargetType="ListBox">  
3:        <Setter Property="Template">  
4:          <Setter.Value>  
5:            <ControlTemplate TargetType="ListBox">  
6:              <Border CornerRadius="5" Background="{TemplateBinding Background}">  
7:                <ScrollViewer HorizontalScrollBarVisibility="Auto">  
8:                  <StackPanel Orientation="Horizontal"  
9:                        VerticalAlignment="Center"  
10:                        HorizontalAlignment="Center"  
11:                        IsItemsHost="True" />  
12:                </ScrollViewer>  
13:              </Border>  
14:            </ControlTemplate>  
15:          </Setter.Value>  
16:        </Setter>  
17:      </Style>  

이미지 가로 정렬

ListBoxItem Style

ListBoxItem 모양을 Style로 정의해 일괄 적용하고, 속성 및 이벤트에 변경이 생겼을 경우 Trigger를 이용해 처리 할 수 있습니다.

1:      <Style TargetType="ListBoxItem">  
2:        <Setter Property="Opacity" Value="0.5" />  
3:        <Setter Property="MaxHeight" Value="75" />  
4:        <Style.Triggers>  
5:          <Trigger Property="IsSelected" Value="True">  
6:            <Trigger.Setters>  
7:              <Setter Property="Opacity" Value="1.0" />  
8:            </Trigger.Setters>  
9:          </Trigger>  
10:          <EventTrigger RoutedEvent="Mouse.MouseEnter">  
11:            <EventTrigger.Actions>  
12:              <BeginStoryboard>  
13:                <Storyboard>  
14:                  <DoubleAnimation Duration="0:0:0.2"  
15:                           Storyboard.TargetProperty="MaxHeight"  
16:                           To="90" />  
17:                </Storyboard>  
18:              </BeginStoryboard>  
19:            </EventTrigger.Actions>  
20:          </EventTrigger>  
21:          <EventTrigger RoutedEvent="Mouse.MouseLeave">  
22:            <EventTrigger.Actions>  
23:              <BeginStoryboard>  
24:                <Storyboard>  
25:                  <DoubleAnimation Duration="0:0:1"  
26:                           Storyboard.TargetProperty="MaxHeight" />  
27:                </Storyboard>  
28:              </BeginStoryboard>  
29:            </EventTrigger.Actions>  
30:          </EventTrigger>  
31:        </Style.Triggers>  
32:      </Style>  











댓글

이 블로그의 인기 게시물

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

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

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