■ StorageFile 클래스를 사용하는 방법을 보여준다.
▶ NotifyType.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
namespace TestProject { /// <summary> /// 통지 타입 /// </summary> public enum NotifyType { /// <summary> /// 상태 메시지 /// </summary> StatusMessage, /// <summary> /// 에러 메시지 /// </summary> ErrorMessage }; } |
▶ Scenario.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
using System; namespace TestProject { /// <summary> /// 시나리오 /// </summary> public class Scenario { //////////////////////////////////////////////////////////////////////////////////////////////////// Property ////////////////////////////////////////////////////////////////////////////////////////// Public #region 제목 - Title /// <summary> /// 제목 /// </summary> public string Title { get; set; } #endregion #region 클래스 타입 - ClassType /// <summary> /// 클래스 타입 /// </summary> public Type ClassType { get; set; } #endregion } } |
▶ SamplePage01.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<Page x:Class="TestProject.SamplePage01" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 이 샘플의 시나리오를 연습하려면 새 파일 'sample.dat'를 만드십시오. 사진 라이브러리에 파일이 생성됩니다. </TextBlock> <Button Margin="0 10 0 0" Content="파일 생성" Click="createFileButton_Click" /> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage01.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
using System; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace TestProject { /// <summary> /// 샘플 페이지 1 /// </summary> public sealed partial class SamplePage01 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage01() /// <summary> /// 생성자 /// </summary> public SamplePage01() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 파일 생성 버튼 클릭시 처리하기 - createFileButton_Click(sender, e) /// <summary> /// 파일 생성 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void createFileButton_Click(object sender, RoutedEventArgs e) { StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null /* 현재 사용자 */, KnownFolderId.PicturesLibrary); try { this.mainPage.SampleStorageFile = await storageFolder.CreateFileAsync(MainPage.FileName, CreationCollisionOption.ReplaceExisting); this.mainPage.ShowStatusMessage ( $"'{mainPage.SampleStorageFile.Name}' 파일을 생성했습니다.", NotifyType.StatusMessage ); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{MainPage.FileName}' 파일 생성시 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } #endregion } } |
▶ SamplePage02.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<Page x:Class="TestProject.SamplePage02" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 'sample.dat'는 사진 라이브러리에 생성되었습니다. 앱에는 사진 라이브러리 기능이 있으므로 파일이 생성된 폴더에 액세스할 수 있습니다. 폴더를 검색하려면 '부모 조회' 버튼을 클릭합니다. </TextBlock> <Button Margin="0 10 0 0" Content="부모 조회" Click="getParentButton_Click" /> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage02.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
using System; using System.IO; using System.Text; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 샘플 페이지 2 /// </summary> public sealed partial class SamplePage02 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage02() /// <summary> /// 생성자 /// </summary> public SamplePage02() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 부모 조회 버튼 클릭시 처리하기 - getParentButton_Click(sender, e) /// <summary> /// 부모 조회 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void getParentButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { StorageFolder storageFolder = await storageFile.GetParentAsync(); if(storageFolder != null) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine($"항목 : {storageFile.Name} ({storageFile.Path})"); stringBuilder.AppendLine($"부모 : {storageFolder.Name} ({storageFolder.Path})"); this.mainPage.ShowStatusMessage(stringBuilder.ToString(), NotifyType.StatusMessage); } } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion } } |
▶ SamplePage03.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<Page x:Class="TestProject.SamplePage03" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 'sample.data' 파일에 일부 텍스트를 쓰려면 아래 텍스트 상자에 내용을 입력하고 '텍스트 쓰기' 버튼을 클릭합니다. 'sample.dat' 파일의 내용을 읽으려면 '텍스트 읽기' 버튼을 클릭하십시오. </TextBlock> <TextBox Name="sourceTextBox" Margin="0 10 0 0" Height="100" AcceptsReturn="True" TextWrapping="Wrap" Text="ABC123" /> <StackPanel Margin="0 10 0 0" Orientation="Horizontal"> <Button Margin="0 0 10 0" Content="텍스트 쓰기" Click="writeTextButton_Click" /> <Button Content="텍스트 읽기" Click="readTextButton_Click" /> </StackPanel> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage03.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 |
using System; using System.IO; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// Writing and reading text in a file. /// </summary> public sealed partial class SamplePage03 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage03() /// <summary> /// 생성자 /// </summary> public SamplePage03() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 텍스트 쓰기 버튼 클릭시 처리하기 - writeTextButton_Click(sender, e) /// <summary> /// 텍스트 쓰기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void writeTextButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { string fileContent = this.sourceTextBox.Text; await FileIO.WriteTextAsync(storageFile, fileContent); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에 다음과 같이 텍스트를 썼습니다 :\n{fileContent}", NotifyType.StatusMessage ); } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에 텍스트를 쓰는 중 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion #region 텍스트 읽기 버튼 클릭시 처리하기 - readTextButton_Click(sender, e) /// <summary> /// 텍스트 읽기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void readTextButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { string fileContent = await FileIO.ReadTextAsync(storageFile); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에서 다음과 같이 텍스트를 읽었습니다 :\n{fileContent}", NotifyType.StatusMessage ); } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) when (exception.HResult == MainPage.E_NO_UNICODE_TRANSLATION) { this.mainPage.ShowStatusMessage ( "파일을 유니코드로 디코딩할 수 없습니다.", NotifyType.ErrorMessage ); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에서 읽는 중 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion } } |
▶ SamplePage04.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<Page x:Class="TestProject.SamplePage04" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="성명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 일부 바이트 세트를 'sample.dat'에 쓰려면 아래 텍스트 상자에 내용을 입력하고 '바이트 쓰기' 버튼을 클릭합니다. 'sample.dat' 내용으로 바이트 세트를 읽으려면 '바이트 읽기' 버튼을 클릭하십시오. </TextBlock> <TextBox Name="sourceTextBox" Margin="0 10 0 0" Height="100" AcceptsReturn="True" TextWrapping="Wrap" Text="ABC123" /> <StackPanel Margin="0 10 0 0" Orientation="Horizontal"> <Button Margin="0 0 10 0" Content="바이트 쓰기" Click="writeByteButton_Click" /> <Button Content="바이트 읽기" Click="readByteButton_Click" /> </StackPanel> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage04.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
using System; using System.IO; using Windows.Storage; using Windows.Storage.Streams; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 샘플 페이지 4 /// </summary> public sealed partial class SamplePage04 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage04() /// <summary> /// 생성자 /// </summary> public SamplePage04() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 바이트 쓰기 버튼 클릭시 처리하기 - writeByteButton_Click(sender, e) /// <summary> /// 바이트 쓰기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void writeByteButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { string fileContent = this.sourceTextBox.Text; IBuffer buffer = MainPage.GetBuffer(fileContent); await FileIO.WriteBufferAsync(storageFile, buffer); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에 다음과 같이 {buffer.Length} 바이트의 텍스트를 썼습니다 :{Environment.NewLine}{fileContent}", NotifyType.StatusMessage ); } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에 쓰는 중 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion #region 바이트 읽기 버튼 클릭시 처리하기 - readByteButton_Click(sender, e) /// <summary> /// 바이트 읽기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void readByteButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { IBuffer buffer = await FileIO.ReadBufferAsync(storageFile); string fileContent = MainPage.GetString(buffer); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에서 다음과 같이 {buffer.Length} 바이트의 텍스트를 읽었습니다 :\n{fileContent}", NotifyType.StatusMessage ); } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) when (exception.HResult == MainPage.E_NO_UNICODE_TRANSLATION) { this.mainPage.ShowStatusMessage ( "파일이 UTF-8로 인코딩되어 있지 않습니다.", NotifyType.ErrorMessage ); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에서 읽는 중 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion } } |
▶ SamplePage05.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<Page x:Class="TestProject.SamplePage05" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 스트림을 사용하여 'sample.data' 파일에 일부 텍스트를 쓰려면 아래 텍스트 상자에 내용을 입력하고 '스트림 쓰기' 버튼을 클릭합니다. 스트림을 사용하여 'sample.dat' 파일의 내용을 읽으려면 '스트림 읽기' 버튼을 클릭하십시오. </TextBlock> <TextBox Name="sourceTextBox" Margin="0 0 0 10" Height="100" AcceptsReturn="True" TextWrapping="Wrap" Text="ABC123" /> <StackPanel Margin="0 10 0 0" Orientation="Horizontal"> <Button Margin="0 0 10 0" Content="스트림 쓰기" Click="writeStreamButton_Click" /> <Button Content="스트림 읽기" Click="readStreamButton_Click" /> </StackPanel> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage05.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
using System; using System.IO; using Windows.Storage; using Windows.Storage.Streams; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 샘플 페이지 5 /// </summary> public sealed partial class SamplePage05 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage05() /// <summary> /// 생성자 /// </summary> public SamplePage05() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 스트림 쓰기 버튼 클릭시 처리하기 - writeStreamButton_Click(sender, e) /// <summary> /// 스트림 쓰기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void writeStreamButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { string fileContent = this.sourceTextBox.Text; using(StorageStreamTransaction transaction = await storageFile.OpenTransactedWriteAsync()) { IBuffer buffer = MainPage.GetBuffer(fileContent); await transaction.Stream.WriteAsync(buffer); transaction.Stream.Size = buffer.Length; await transaction.CommitAsync(); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에 스트림을 사용해 다음과 같이 텍스트를 썼습니다 :\n{fileContent}", NotifyType.StatusMessage ); } } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에 쓰는 중 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion #region 스트림 읽기 버튼 클릭시 처리하기 - readStreamButton_Click(sender, e) /// <summary> /// 스트림 읽기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void readStreamButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { using(IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read)) { ulong size64 = stream.Size; if(size64 <= uint.MaxValue) { uint size32 = (uint)size64; IBuffer buffer = new Windows.Storage.Streams.Buffer(size32); buffer = await stream.ReadAsync(buffer, size32, InputStreamOptions.None); string fileContent = MainPage.GetString(buffer); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에서 스트림을 사용해 다음과 같이 텍스트를 읽었습니다 :\n{fileContent}", NotifyType.StatusMessage ); } else { this.mainPage.ShowStatusMessage ( $"{storageFile.Name} 파일이 너무 커서 ReadAsync가 단일 청크에서 읽을 수 없습니다. " + "4GB보다 큰 파일은 ReadAsync에서 읽을 수 있도록 여러 청크로 나누어야 합니다.", NotifyType.ErrorMessage ); } } } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) when (exception.HResult == MainPage.E_NO_UNICODE_TRANSLATION) { this.mainPage.ShowStatusMessage ( "파일이 UTF-8로 인코딩되어 있지 않습니다.", NotifyType.ErrorMessage ); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일에서 읽는 중 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion } } |
▶ SamplePage06.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<Page x:Class="TestProject.SamplePage06" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 :" /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 'sample.dat'에 대한 파일 속성을 검색하고 표시하려면 '속성 표시' 버튼을 클릭하십시오. </TextBlock> <Button Margin="0 10 0 0" Content="속성 표시" Click="showPropertyButton_Click" /> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage06.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
using System; using System.Collections.Generic; using System.IO; using System.Text; using Windows.Storage; using Windows.Storage.FileProperties; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 샘플 페이지 6 /// </summary> public sealed partial class SamplePage06 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage06() /// <summary> /// 생성자 /// </summary> public SamplePage06() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 속성 표시 버튼 클릭시 처리하기 - showPropertyButton_Click(sender, e) /// <summary> /// 속성 표시 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void showPropertyButton_Click(object sender, RoutedEventArgs e) { const string dateAccessedProperty = "System.DateAccessed"; const string fileOwnerProperty = "System.FileOwner"; StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine($"파일명 : {storageFile.Name}"); stringBuilder.AppendLine($"파일 타입 : {storageFile.FileType}"); BasicProperties basicProperties = await storageFile.GetBasicPropertiesAsync(); stringBuilder.AppendLine($"파일 크기 : {basicProperties.Size} 바이트"); stringBuilder.AppendLine($"데이터 수정 : {basicProperties.DateModified}"); IDictionary<string, object> dictionary = await storageFile.Properties.RetrievePropertiesAsync ( new[] { dateAccessedProperty, fileOwnerProperty } ); object propertyValue = dictionary[dateAccessedProperty]; if(propertyValue != null) { stringBuilder.AppendLine($"데이터 액세스 : {propertyValue}"); } propertyValue = dictionary[fileOwnerProperty]; if(propertyValue != null) { stringBuilder.Append($"파일 소유자 : {propertyValue}"); } this.mainPage.ShowStatusMessage(stringBuilder.ToString(), NotifyType.StatusMessage); } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일의 속성 조회시 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion } } |
▶ SamplePage07.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<Page x:Class="TestProject.SamplePage07" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 나중에 사용할 수 있도록 스토리지 항목에 대한 액세스를 유지합니다. </TextBlock> <TextBlock Style="{StaticResource BaseMessageStyle}" Margin="0 10 0 0" TextWrapping="Wrap"> 가장 최근에 사용한(MRU) 목록을 사용하여 사용자가 자주 액세스하는 저장소 항목(예 : 파일, 폴더 등)을 추적합니다. MRU는 최대 25개의 항목을 보유하며 Windows에서 유지 관리합니다. <LineBreak/> <LineBreak/> 앱의 MRU에 항목을 추가할 때 시스템 MRU에 추가하여 시스템 전체의 최근 항목 목록(사용 가능한 경우)에 표시되도록 할 수도 있습니다. <LineBreak/> <LineBreak/> FAL(향후 액세스 목록)을 사용하여 파일 선택기를 통해 액세스하는 항목과 같이 앱의 기능으로 지정되지 않은 위치에 있는 저장소 항목(예: 파일, 폴더 등)에 대한 액세스를 유지합니다. FAL은 최대 1000개의 항목을 보유하며 앱에서 유지 관리해야 합니다. <LineBreak/> <LineBreak/> 목록에 추가하려면 목록을 선택한 다음 '목록에 추가' 버튼을 클릭하세요. 목록의 현재 내용을 보려면 목록을 선택한 다음 '목록 표시' 버튼을 클릭합니다. 목록에서 'sample.dat' 파일을 열려면 목록을 선택한 다음 '목록에서 열기' 버튼을 클릭합니다. </TextBlock> <RadioButton Name="mruRadioButton" Margin="0 10 0 0" GroupName="PersistenceList" IsChecked="True" Content="MRU" /> <CheckBox Name="systemMRUCheckBox" Margin="30 0 0 0" IsChecked="True" Content="시스템 MRU에 추가" /> <RadioButton Margin="0 10 0 0" GroupName="PersistenceList" Content="FAL" /> <Button Margin="0 10 0 0" Content="목록에 추가" Click="addToListButton_Click" /> <Button Margin="0 10 0 0" Content="목록 표시" Click="showListButton_Click" /> <Button Margin="0 10 0 0" Content="목록에서 열기" Click="openFromListButton_Click" /> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage07.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 |
using System; using System.Text; using Windows.Storage; using Windows.Storage.AccessCache; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 샘플 페이지 7 /// </summary> public sealed partial class SamplePage07 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; /// <summary> /// FA_E_MAX_PERSISTED_ITEMS_REACHED /// </summary> private const int FA_E_MAX_PERSISTED_ITEMS_REACHED = unchecked((int)0x80270220); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage07() /// <summary> /// 생성자 /// </summary> public SamplePage07() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 목록에 추가 버튼 클릭시 처리하기 - addToListButton_Click(sender, e) /// <summary> /// 목록에 추가 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void addToListButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { if(this.mruRadioButton.IsChecked.Value) { RecentStorageItemVisibility visibility = this.systemMRUCheckBox.IsChecked.Value ? RecentStorageItemVisibility.AppAndSystem : RecentStorageItemVisibility.AppOnly; this.mainPage.mruToken = StorageApplicationPermissions.MostRecentlyUsedList.Add(storageFile, storageFile.Name, visibility); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일이 MRU 목록에 추가되었고 토큰이 저장되었습니다.", NotifyType.StatusMessage ); } else { try { this.mainPage.falToken = StorageApplicationPermissions.FutureAccessList.Add(storageFile, storageFile.Name); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일이 FAL 목록에 추가되었고 토큰이 저장되었습니다.", NotifyType.StatusMessage ); } catch(Exception exception) when (exception.HResult == FA_E_MAX_PERSISTED_ITEMS_REACHED) { this.mainPage.ShowStatusMessage ( $"FAL 목록이 가득차서 '{storageFile.Name}' 파일이 FAL 목록에 추가되지 않았습니다.", NotifyType.ErrorMessage ); } } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion #region 목록 표시 버튼 클릭시 처리하기 - showListButton_Click(sender, e) /// <summary> /// 목록 표시 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void showListButton_Click(object sender, RoutedEventArgs e) { AccessListEntryView entryView; string listName; if(this.mruRadioButton.IsChecked.Value) { listName = "MRU"; entryView = StorageApplicationPermissions.MostRecentlyUsedList.Entries; } else { listName = "FAL"; entryView = StorageApplicationPermissions.FutureAccessList.Entries; } if(entryView.Count > 0) { StringBuilder stringBuilder = new StringBuilder($"{listName} 목록은 다음 항목을 포함합니다 : "); foreach(AccessListEntry entry in entryView) { stringBuilder.AppendLine(); stringBuilder.Append(entry.Metadata); } this.mainPage.ShowStatusMessage(stringBuilder.ToString(), NotifyType.StatusMessage); } else { this.mainPage.ShowStatusMessage ( $"{listName} 목록이 비어 있습니다.", NotifyType.ErrorMessage ); } } #endregion #region 목록에서 열기 버튼 클릭시 처리하기 - openFromListButton_Click(sender, e) /// <summary> /// 목록에서 열기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void openFromListButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = null; if(this.mruRadioButton.IsChecked.Value) { if(this.mainPage.mruToken != null) { if(StorageApplicationPermissions.MostRecentlyUsedList.ContainsItem(this.mainPage.mruToken)) { storageFile = await StorageApplicationPermissions.MostRecentlyUsedList.GetFileAsync(this.mainPage.mruToken); } else { this.mainPage.ShowStatusMessage ( "토큰이 더 이상 유효하지 않습니다.", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowStatusMessage ( "이 작업은 토큰을 요구합니다. 먼저 MRU 목록에 파일을 추가합니다.", NotifyType.ErrorMessage ); } } else { if(this.mainPage.falToken != null) { storageFile = await StorageApplicationPermissions.FutureAccessList.GetFileAsync(this.mainPage.falToken); } else { this.mainPage.ShowStatusMessage ( "이 작업은 토큰을 요구합니다. 먼저 FAL 목록에 파일을 추가합니다.", NotifyType.ErrorMessage ); } } if(storageFile != null) { try { string fileContent = await FileIO.ReadTextAsync(storageFile); this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일이 저장된 토큰에 의해 열렸습니다. 다음 텍스트를 포함합니다 :\n{fileContent}", NotifyType.StatusMessage ); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"목록에서 열려진 파일을 읽는 중 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } } #endregion } } |
▶ SamplePage08.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<Page x:Class="TestProject.SamplePage08" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 'sample.dat' 파일을 사진 라이브러리에 복사하려면 '파일 복사' 버튼을 클릭하십시오. </TextBlock> <Button Margin="0 10 0 0" Content="파일 복사" Click="copyFileButton_Click" /> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage08.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
using System; using System.IO; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 샘플 페이지 8 /// </summary> public sealed partial class SamplePage08 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage08() /// <summary> /// 생성자 /// </summary> public SamplePage08() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 발생자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 파일 복사 버튼 클릭시 처리하기 - copyFileButton_Click(sender, e) /// <summary> /// 파일 복사 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void copyFileButton_Click(object sender, RoutedEventArgs e) { StorageFile sourceStorageFile = this.mainPage.SampleStorageFile; if(sourceStorageFile != null) { try { StorageFolder stroageFolder = await KnownFolders.GetFolderForUserAsync(null /* 현재 사용자 */, KnownFolderId.PicturesLibrary); StorageFile targetStorageFile = await sourceStorageFile.CopyAsync ( stroageFolder, "sample-copy.dat", NameCollisionOption.ReplaceExisting ); this.mainPage.ShowStatusMessage ( $"'{sourceStorageFile.Name}' 파일이 복사되었고 새 파일명은 '{targetStorageFile.Name}' 입니다.", NotifyType.StatusMessage ); } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{sourceStorageFile.Name}' 파일 복사중 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion } } |
▶ SamplePage09.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<Page x:Class="TestProject.SamplePage09" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 파일을 선택하고 'sample.dat'와 비교하려면 '파일 비교'를 클릭하십시오. 예를 들어, 저장 시나리오에서 사용자가 동일한 파일을 덮어쓰는지 또는 새 파일을 생성하는지 결정할 수 있습니다. </TextBlock> <Button Margin="0 10 0 0" Content="파일 비교" Click="compareFileButton_Click" /> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage09.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
using System; using System.IO; using Windows.Storage; using Windows.Storage.Pickers; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 샘플 페이지 9 /// </summary> public sealed partial class SamplePage09 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage09() /// <summary> /// 생성자 /// </summary> public SamplePage09() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 파일 비교 버튼 클릭시 처리하기 - compareFileButton_Click(sender, e) /// <summary> /// 파일 비교 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void compareFileButton_Click(object sender, RoutedEventArgs e) { StorageFile sourceStorageFile = this.mainPage.SampleStorageFile; if(sourceStorageFile != null) { FileOpenPicker fileOpenPicker = new FileOpenPicker(); fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; fileOpenPicker.FileTypeFilter.Add("*"); StorageFile targetStorageFile = await fileOpenPicker.PickSingleFileAsync(); if(targetStorageFile != null) { try { if(sourceStorageFile.IsEqual(targetStorageFile)) { this.mainPage.ShowStatusMessage("파일들이 같습니다.", NotifyType.StatusMessage); } else { this.mainPage.ShowStatusMessage("파일들이 같지 않습니다.", NotifyType.StatusMessage); } } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } } else { this.mainPage.ShowStatusMessage("작업이 취소되었습니다.", NotifyType.StatusMessage); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion } } |
▶ SamplePage10.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<Page x:Class="TestProject.SamplePage10" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 'sample.dat' 파일을 삭제하려면 '파일 삭제' 버튼을 클릭하세요. </TextBlock> <Button Margin="0 10 0 0" Content="파일 삭제" Click="deleteFileButton_Click" /> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage10.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
using System; using System.IO; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 샘플 페이지 10 /// </summary> public sealed partial class SamplePage10 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage10() /// <summary> /// 생성자 /// </summary> public SamplePage10() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { this.mainPage.ValidateFile(); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Private #region 파일 삭제 버튼 클릭시 처리하기 - deleteFileButton_Click(sender, e) /// <summary> /// 파일 삭제 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void deleteFileButton_Click(object sender, RoutedEventArgs e) { StorageFile storageFile = this.mainPage.SampleStorageFile; if(storageFile != null) { try { string filename = storageFile.Name; await storageFile.DeleteAsync(); this.mainPage.SampleStorageFile = null; this.mainPage.ShowStatusMessage($"'{filename}' 파일을 삭제했습니다.", NotifyType.StatusMessage); } catch(FileNotFoundException) { this.mainPage.ShowFileNotFoundStatusMessage(); } catch(Exception exception) { this.mainPage.ShowStatusMessage ( $"'{storageFile.Name}' 파일 삭제시 에러가 발생했습니다 : {exception.Message}", NotifyType.ErrorMessage ); } } else { this.mainPage.ShowFileNotFoundStatusMessage(); } } #endregion } } |
▶ SamplePage11.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<Page x:Class="TestProject.SamplePage11" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <ScrollViewer Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Padding="10"> <StackPanel> <TextBlock Style="{StaticResource SampleHeaderTextStyle}" Text="설명 : " /> <TextBlock Style="{StaticResource ScenarioDescriptionTextStyle}" TextWrapping="Wrap"> 'sample.dat' 파일을 검색하려면 '파일 가져오기'를 클릭하십시오. TryGetItemAsync 메서드는 파일을 가져올 수 없는 경우 예외를 throw하지 않습니다. </TextBlock> <Button Margin="0 10 0 0" Content="파일 가져오기" Click="getFileButton_Click" /> </StackPanel> </ScrollViewer> </Page> |
▶ SamplePage11.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
using System; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace TestProject { /// <summary> /// 샘플 페이지 11 /// </summary> public sealed partial class SamplePage11 : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 메인 페이지 /// </summary> private MainPage mainPage = MainPage.CurrentPage; #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - SamplePage11() /// <summary> /// 생성자 /// </summary> public SamplePage11() { InitializeComponent(); } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Private #region 파일 가져오기 버튼 클릭시 처리하기 - getFileButton_Click(sender, e) /// <summary> /// 파일 가져오기 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private async void getFileButton_Click(object sender, RoutedEventArgs e) { StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null /* 현재 사용자 */, KnownFolderId.PicturesLibrary); StorageFile storageFile = await storageFolder.TryGetItemAsync("sample.dat") as StorageFile; if(storageFile != null) { this.mainPage.ShowStatusMessage($"작업 결과 : {storageFile.Name}", NotifyType.StatusMessage); } else { this.mainPage.ShowStatusMessage("작업 결과 : null", NotifyType.StatusMessage); } } #endregion } } |
▶ MainPage.xaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
<Page x:Class="TestProject.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:TestProject" FontFamily="나눔고딕코딩" FontSize="16"> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid.RowDefinitions> <RowDefinition Height="Auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <StackPanel Grid.Row="0" Orientation="Horizontal"> <Border Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}"> <ToggleButton Style="{StaticResource SymbolButton}" VerticalAlignment="Center" Foreground="{ThemeResource ApplicationForegroundThemeBrush}" Click="paneToggleButton_Click"> <ToggleButton.Content> <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="" /> </ToggleButton.Content> </ToggleButton> </Border> <Image VerticalAlignment="Center" Margin="5 5 0 0" AutomationProperties.AccessibilityView="Raw" Stretch="None" Source="IMAGE/windows-sdk.png" /> <TextBlock Style="{StaticResource TagLineTextStyle}" VerticalAlignment="Center" Margin="5 0 0 0" Text="유니버셜 윈도우즈 플랫폼 예제" /> </StackPanel> <SplitView Name="splitView" Grid.Row="1" DisplayMode="Inline" IsPaneOpen="True"> <SplitView.Pane> <RelativePanel Margin="10 0 0 0"> <TextBlock Name="sampleTitle" Style="{StaticResource SampleHeaderTextStyle}" Margin="0 10 0 0" TextWrapping="Wrap" Text="파일 액세스 예제" /> <ListBox Name="listBox" RelativePanel.Below="sampleTitle" RelativePanel.AlignBottomWithPanel="True" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="0 10 0 0" BorderThickness="0" Background="Transparent" SelectionMode="Single" SelectionChanged="listBox_SelectionChanged"> <ListBox.ItemTemplate> <DataTemplate x:DataType="local:Scenario"> <TextBlock Text="{x:Bind Title}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox> </RelativePanel> </SplitView.Pane> <RelativePanel> <Frame Name="frame" RelativePanel.AlignLeftWithPanel="True" RelativePanel.AlignRightWithPanel="True" RelativePanel.AlignTopWithPanel="True" RelativePanel.Above="statusStackPanel" Margin="5" /> <StackPanel Name="statusStackPanel" Orientation="Vertical" RelativePanel.AlignLeftWithPanel="True" RelativePanel.AlignRightWithPanel="True" RelativePanel.AlignBottomWithPanel="True"> <TextBlock Margin="10 0 0 10" TextWrapping="Wrap" Text="상태 : " /> <Border Name="statusBorder" Margin="0 0 0 0"> <ScrollViewer VerticalScrollMode="Auto" VerticalScrollBarVisibility="Auto" MaxHeight="200"> <TextBlock Name="statusTextBlock" AutomationProperties.LiveSetting="Assertive" Margin="10 10 10 20" MaxWidth="{Binding ElementName=Splitter, Path=ActualWidth}" TextWrapping="Wrap" FontWeight="Bold" /> </ScrollViewer> </Border> </StackPanel> </RelativePanel> </SplitView> </Grid> </Page> |
▶ MainPage.xaml.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 |
using System; using System.Collections.Generic; using Windows.Foundation; using Windows.Graphics.Display; using Windows.Security.Cryptography; using Windows.Storage; using Windows.Storage.Streams; using Windows.UI; using Windows.UI.Core; using Windows.UI.ViewManagement; using Windows.UI.Xaml; using Windows.UI.Xaml.Automation.Peers; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; namespace TestProject { /// <summary> /// 메인 페이지 /// </summary> public sealed partial class MainPage : Page { //////////////////////////////////////////////////////////////////////////////////////////////////// Field ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Public #region Field /// <summary> /// 현재 페이지 /// </summary> public static MainPage CurrentPage; /// <summary> /// 파일명 /// </summary> public static readonly string FileName = "sample.dat"; #endregion ////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Private #region Field /// <summary> /// 시나리오 리스트 /// </summary> private List<Scenario> scenarioList = new List<Scenario> { new Scenario() { Title = "파일 생성" , ClassType = typeof(SamplePage01) }, new Scenario() { Title = "파일의 부모 폴더 조회" , ClassType = typeof(SamplePage02) }, new Scenario() { Title = "파일에 텍스트 쓰기/읽기" , ClassType = typeof(SamplePage03) }, new Scenario() { Title = "파일에 바이트 쓰기/읽기" , ClassType = typeof(SamplePage04) }, new Scenario() { Title = "스트림을 사용해 쓰기/읽기" , ClassType = typeof(SamplePage05) }, new Scenario() { Title = "파일 속성 표시" , ClassType = typeof(SamplePage06) }, new Scenario() { Title = "향후 사용을 위해 저장소 항목에 지속적 액세스", ClassType = typeof(SamplePage07) }, new Scenario() { Title = "파일 복사" , ClassType = typeof(SamplePage08) }, new Scenario() { Title = "동일 파일 확인을 위해 두 파일 비교" , ClassType = typeof(SamplePage09) }, new Scenario() { Title = "파일 삭제" , ClassType = typeof(SamplePage10) }, new Scenario() { Title = "실패시 오류없이 파일 조회 시도" , ClassType = typeof(SamplePage11) } }; /// <summary> /// 샘플 저장소 파일 /// </summary> public StorageFile SampleStorageFile = null; /// <summary> /// MRU 토큰 /// </summary> public string mruToken = null; /// <summary> /// FAL 토큰 /// </summary> public string falToken = null; /// <summary> /// E_NO_UNICODE_TRANSLATION /// </summary> public const int E_NO_UNICODE_TRANSLATION = unchecked((int)0x80070459); #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor ////////////////////////////////////////////////////////////////////////////////////////// Public #region 생성자 - MainPage() /// <summary> /// 생성자 /// </summary> public MainPage() { InitializeComponent(); #region 윈도우 크기를 설정한다. double width = 800d; double height = 600d; double dpi = (double)DisplayInformation.GetForCurrentView().LogicalDpi; ApplicationView.PreferredLaunchWindowingMode = ApplicationViewWindowingMode.PreferredLaunchViewSize; Size windowSize = new Size(width * 96d / dpi, height * 96d / dpi); ApplicationView.PreferredLaunchViewSize = windowSize; Window.Current.Activate(); ApplicationView.GetForCurrentView().TryResizeView(windowSize); #endregion #region 윈도우 제목을 설정한다. ApplicationView.GetForCurrentView().Title = "StorageFile 클래스 사용하기"; #endregion CurrentPage = this; } #endregion //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Internal #region 버퍼 구하기 - GetBuffer(source) /// <summary> /// 버퍼 구하기 /// </summary> /// <param name="source">소스 문자열</param> /// <returns>버퍼</returns> internal static IBuffer GetBuffer(string source) { if(string.IsNullOrEmpty(source)) { return new Windows.Storage.Streams.Buffer(0); } else { return CryptographicBuffer.ConvertStringToBinary(source, BinaryStringEncoding.Utf8); } } #endregion #region 문자열 구하기 - GetString(buffer) /// <summary> /// 문자열 구하기 /// </summary> /// <param name="buffer">버퍼</param> /// <returns>문자열</returns> internal static string GetString(IBuffer buffer) { // 버퍼가 적절히 인코딩되지 않는 경우 E_NO_UNICODE_TRANSLATION 예외가 발생한다. return CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, buffer); } #endregion ////////////////////////////////////////////////////////////////////////////////////////// Instance //////////////////////////////////////////////////////////////////////////////// Internal #region 파일 부재 상태 메시지 표시하기 - ShowFileNotFoundStatusMessage() /// <summary> /// 파일 부재 상태 메시지 표시하기 /// </summary> internal void ShowFileNotFoundStatusMessage() { ShowStatusMessage ( $"'{FileName}' 파일이 없습니다. 1번 시나리오를 사용해 이 파일을 생성하십시오.", NotifyType.ErrorMessage ); } #endregion #region 파일 검증하기 - ValidateFile() /// <summary> /// 파일 검증하기 /// </summary> internal async void ValidateFile() { StorageFolder storageFolder = await KnownFolders.GetFolderForUserAsync(null /* 현재 사용자 */, KnownFolderId.PicturesLibrary); SampleStorageFile = (await storageFolder.TryGetItemAsync(FileName)) as StorageFile; if(SampleStorageFile == null) { ShowFileNotFoundStatusMessage(); } } #endregion //////////////////////////////////////////////////////////////////////////////// Protected #region 탐색되는 경우 처리하기 - OnNavigatedTo(e) /// <summary> /// 탐색되는 경우 처리하기 /// </summary> /// <param name="e">이벤트 인자</param> protected override void OnNavigatedTo(NavigationEventArgs e) { List<Scenario> sourceList = new List<Scenario>(); int i = 1; foreach(Scenario scenario in scenarioList) { sourceList.Add ( new Scenario { Title = $"{i++}) {scenario.Title}", ClassType = scenario.ClassType } ); } this.listBox.ItemsSource = sourceList; if(Window.Current.Bounds.Width < 640) { this.listBox.SelectedIndex = -1; } else { this.listBox.SelectedIndex = 0; } } #endregion //////////////////////////////////////////////////////////////////////////////// Private #region 창 토글 버튼 클릭시 처리하기 - paneToggleButton_Click(sender, e) /// <summary> /// 창 토글 버튼 클릭시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void paneToggleButton_Click(object sender, RoutedEventArgs e) { this.splitView.IsPaneOpen = !splitView.IsPaneOpen; } #endregion #region 리스트 박스 선택 변경시 처리하기 - listBox_SelectionChanged(sender, e) /// <summary> /// 리스트 박스 선택 변경시 처리하기 /// </summary> /// <param name="sender">이벤트 발생자</param> /// <param name="e">이벤트 인자</param> private void listBox_SelectionChanged(object sender, SelectionChangedEventArgs e) { ShowStatusMessage(string.Empty, NotifyType.StatusMessage); ListBox listBox = sender as ListBox; Scenario scenario = listBox.SelectedItem as Scenario; if(scenario != null) { this.frame.Navigate(scenario.ClassType); if(Window.Current.Bounds.Width < 640) { this.splitView.IsPaneOpen = false; } } } #endregion #region 상태 메시지 업데이트하기 - UpdateStatusMessage(message, notifyType) /// <summary> /// 상태 메시지 업데이트하기 /// </summary> /// <param name="message">메시지</param> /// <param name="notifyType">통지 타입</param> private void UpdateStatusMessage(string message, NotifyType notifyType) { switch(notifyType) { case NotifyType.StatusMessage : this.statusBorder.Background = new SolidColorBrush(Colors.Green); break; case NotifyType.ErrorMessage : this.statusBorder.Background = new SolidColorBrush(Colors.Red); break; } this.statusTextBlock.Text = message; this.statusBorder.Visibility = (this.statusTextBlock.Text != string.Empty) ? Visibility.Visible : Visibility.Collapsed; if(this.statusTextBlock.Text != string.Empty) { this.statusBorder.Visibility = Visibility.Visible; this.statusStackPanel.Visibility = Visibility.Visible; } else { this.statusBorder.Visibility = Visibility.Collapsed; this.statusStackPanel.Visibility = Visibility.Collapsed; } AutomationPeer peer = FrameworkElementAutomationPeer.FromElement(this.statusTextBlock); if(peer != null) { peer.RaiseAutomationEvent(AutomationEvents.LiveRegionChanged); } } #endregion #region 상태 메시지 표시하기 - ShowStatusMessage(message, notifyType) /// <summary> /// 상태 메시지 표시하기 /// </summary> /// <param name="message">메시지</param> /// <param name="notifyType">통지 타입</param> public async void ShowStatusMessage(string message, NotifyType notifyType) { if(Dispatcher.HasThreadAccess) { UpdateStatusMessage(message, notifyType); } else { await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => UpdateStatusMessage(message, notifyType)); } } #endregion } } |