Windows App SDK 1.8 릴리즈

Windows App SDK 1.8 버전이 릴리즈 되었습니다. NuGet 메타패키지로의 변환, StoragePicker 등의 기능이 포함됩니다. 자세한 내용은 릴리즈 노트에서 확인하실 수 있습니다.

9개의 좋아요

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만 갖는 경량 클래스)
5개의 좋아요