[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 응용 프로그램 상태 유지 및 복원

응용 프로그램 상태 유지 및 복원


표준 Windows 응용 프로그램은 사용자 보안 설정에 따라 컴퓨터에 대한 모든 액세스 권한을 가질 수 있으므로 Windows 레지스트리 또는 로컬 파일 시스템 사용과 같이 데이터를 저장하기위한 다양한 옵션이 있습니다. 또 다른 대안은 .NET Framework의 격리 된 저장소 기술을 사용하는 것입니다. 


 IsolatedStorageFile 및 IsolatedStorageFileStream 클래스를 이용해 Window의 BackgroundColor를 설정한 후 상태 유지를 위해 격리 된 저장소에 파일 저장을 한 후 파일을 읽어 복원 시키는 예제를 만들어 보겠습니다.

예제

Window의 Background Color를 설정하는 버튼 2개를 선언 합니다. White 버튼은 Background Color를 흰색으로 Black 버튼은 Background Color를 검은색으로 변경하는 이벤트를 설정 합니다.

App 실행 화면

XAML 선언
1:  <Window x:Class="PersistAndRestoreApplication.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:PersistAndRestoreApplication"  
7:      mc:Ignorable="d"  
8:      Title="MainWindow"   
9:      Height="350"   
10:      Width="525">  
11:    <StackPanel Orientation="Horizontal"   
12:          HorizontalAlignment="Center"   
13:          Margin="30"   
14:          Button.Click="StackPanel_Click">  
15:      <Button Content="White" Margin="20" Width="200" />  
16:      <Button Content="Black" Margin="20" Width="200" />  
17:    </StackPanel>  
18:  </Window>  

전역적으로 사용할 클래스를 선언하고, 속성 키로 사용할 정적 문자열을 선업합니다.
1:  public static class Globalvariables  
2:    {  
3:      public static string WindowBackgroudBrushKey = "AppBackgroundBrush";  
4:    }  

Application 시작 시 저장된 Background Color를 읽어야 하고, Application 종료 시 설정된 Background Color를 저장해야 합니다. Application에 선언되어 있는 Startup, Exit 이벤트를 이용하도록 합니다.
1:  <Application x:Class="PersistAndRestoreApplication.App"  
2:         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
3:         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"  
4:         xmlns:local="clr-namespace:PersistAndRestoreApplication"  
5:         StartupUri="MainWindow.xaml"  
6:         Startup="Application_Startup"  
7:         Exit="Application_Exit">  
8:    <Application.Resources>  
9:    </Application.Resources>  
10:  </Application>  

Application 시작 시 호출되는 Startup 이벤트 코드를 작성 합니다.
1:   private void Application_Startup(object sender, StartupEventArgs e)  
2:      {  
3:        IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();  
4:        try  
5:        {  
6:          using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Open, storage))  
7:          {  
8:            using (StreamReader reader = new StreamReader(stream))  
9:            {  
10:              // 응용 프로그램 범위 속성을 개별적으로 복원  
11:              while (!reader.EndOfStream)  
12:              {  
13:                string[] keyValue = reader.ReadLine().Split(new char[] { ',' });  
14:                this.Properties[keyValue[0]] = keyValue[1];  
15:              }  
16:            }  
17:          }  
18:        }  
19:        catch (FileNotFoundException ex)  
20:        {  
21:          // - 첫 어플리케이션 세션일 경우  
22:          // - 파일이 삭제되었을 경우  
23:          this.Properties[Globalvariables.WindowBackgroudBrushKey] = Brushes.White;  
24:        }  
25:      }  

Application 종료 시 Property 속성의 값을 읽어 격리된 저장소에 저장하는 코드를 Exit 이벤트에 코드를 작성 합니다.
1:  private void Application_Exit(object sender, ExitEventArgs e)  
2:      {  
3:        IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForDomain();  
4:        using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream(fileName, FileMode.Create, storage))  
5:        {  
6:          using (StreamWriter writer = new StreamWriter(stream))  
7:          {  
8:            foreach (string key in Properties.Keys)  
9:            {  
10:              writer.WriteLine("{0},{1}", key, Properties[key]);  
11:            }  
12:          }  
13:        }  
14:      }  

IsolatedStorageFile 및 IsolatedStorageFileStream 클래스를 이용해 Application이 실행될 때 설정된 값을 읽어 Property 속성에 설정 합니다. 이 설정된 값을 적용하기 위해 Window가 생성될 때 Window의 Background 속성에 설정 합니다.
1:  public MainWindow()  
2:      {  
3:        InitializeComponent();  
4:        this.Background = new SolidColorBrush(  
5:          (Color)ColorConverter.ConvertFromString(  
6:            Application.Current.Properties[Globalvariables.WindowBackgroudBrushKey].ToString()));  
7:      }  

마지막으로 Background 설정을 변경 하고, Property 속성에 현재 Background Color를 저장하는 버튼 클릭 이벤트를 작성 합니다.
1:  private void StackPanel_Click(object sender, RoutedEventArgs e)  
2:      {  
3:        Button source = e.Source as Button;  
4:        if (source.Content.ToString() == "White")  
5:        {  
6:          this.Background = Brushes.White;  
7:        }  
8:        else  
9:        {  
10:          this.Background = Brushes.Black;  
11:        }  
12:        Application.Current.Properties[Globalvariables.WindowBackgroudBrushKey] = this.Background;  
13:      }  

이것으로 마치도록 하겠습니다.

댓글

이 블로그의 인기 게시물

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

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

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