응용 프로그램 상태 유지 및 복원
표준 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: }
이것으로 마치도록 하겠습니다.
댓글
댓글 쓰기