Windows App SDK 1.8 버전이 릴리즈 되었습니다. NuGet 메타패키지로의 변환, StoragePicker 등의 기능이 포함됩니다. 자세한 내용은 릴리즈 노트에서 확인하실 수 있습니다.
FileOpenPicker, FileSavePicker, FolderPicker는 WinRT에서 파일 및 폴더 액세스에 사용되는 API로, Win32의 OpenFileDialog, SaveFileDialog, OpenFolderDialog 등에 대응됩니다.
데스크톱 앱에서 WinRT Picker API의 한계
Windows.Storage.Pickers 네임스페이스에 위치하는 WinRT Picker API는 두 가지의 주요 한계가 있습니다.
먼저 WinRT의 Picker들은 앱이 관리자 권한으로 실행 중일 때 동작하지 않습니다. WinRT의 Picker들은 권한 상승 없이 샌드박스에서 실행되는 UWP 앱을 위해 설계되었기 때문에, WinUI 3 앱을 관리자 권한으로 실행하면 Picker를 호출할 때 예외가 발생합니다.
두 번째로 소유한 Window의 핸들로 Picker를 초기화해주는 작업이 필요합니다. WinRT의 Picker들은 UWP 앱을 위해 디자인된 WinRT API인 CoreWindow에 의존하는데, CoreWindow를 비롯한 WinRT의 일부 API는 데스크톱 앱에서 사용할 수 없기 때문에 대안으로 소유한 Window의 핸들을 설정해 줘야 합니다.
using Windows.Storage.Pickers;
private Window _window; // picker를 소유하는 Window
private async Task<string> PickSingleFileAsync()
{
FileOpenPicker picker = new();
picker.FileTypeFilter.Add("*"); // 필수
// 부모 Window의 핸들로 Picker를 초기화
IntPtr hwnd = WinRT.Interop.WindowNative.GetWindowHandle(_window);
WinRT.Interop.InitializeWithWindow.Initialize(picker, hwnd);
var file = await picker.PickSingleFileAsync();
return file.Path;
}
Windows App SDK에서의 파일 및 폴더 액세스
Windows App SDK 1.8 버전부터 추가된 Microsoft.Windows.Storage.Pickers 네임스페이스의 Picker API를 사용하면, 이러한 과정을 간략화 할 수 있습니다.
using Microsoft.Windows.Storage.Pickers;
private Window _window;
private async Task<string> PickSingleFileAsync()
{
// 핸들 획득 및 초기화 대신 생성자에 AppWindow.Id 전달
FileOpenPicker picker = new(_window.AppWindow.Id);
var result = await picker.PickSingleFileAsync();
return result.Path;
}
또한 WinRT의 Picker API는 앱이 관리자 권한으로 실행 중일 때 작동하지 않는 반면에, Windows App SDK에서 추가된 Picker API는 앱이 관리자 권한으로 실행 중일 때도 잘 작동합니다.
WinRT의 Picker와 Windows App SDK의 Picker의 주요 차이점
- 권한 상승 지원 여부
- WinRT - 지원하지 않음(예외 발생)
- Windows App SDK - 지원
- 초기화 방법
- WinRT - 부모 윈도우의 핸들을 획득한 후 명시적으로 초기화
- Windows App SDK - 생성자에 부모 윈도우의
AppWindow.Id전달
- Pick 반환값
- WinRT -
StorageFile,StorageFolder - Windows App SDK -
PickFileResult,PickFolderResult(string Path만 갖는 경량 클래스)
- WinRT -