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๊ฐœ์˜ ์ข‹์•„์š”