Introduction

前回はWindowハンドルを取得し、Win32 APIの実行を確認しました。
今回は、 ファイルを開くダイアログ を呼び出すことができるかを確認する。
ソースは下記になります

Have a try!!

ここまで来れば、普通のデスクトップアプリとほとんど変わらないとは思います。
そのため、UWPで気に入らなかったファイルアクセスの制限も当然解除されているのが期待できます。

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
using System;
using Windows.Storage.Pickers;
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
using Microsoft.UI.Xaml.Media.Imaging;
using WinRT.Interop;

// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.

namespace App
{

/// <summary>
/// An empty window that can be used on its own or navigated to within a Frame.
/// </summary>
public sealed partial class MainWindow : Window
{

#region Construtors

public MainWindow()
{
this.InitializeComponent();
}

#endregion

#region Event Handlers

private async void myButton_Click(object sender, RoutedEventArgs e)
{
var hwnd = WindowNative.GetWindowHandle(this);

try
{
var picker = new FileOpenPicker();
picker.FileTypeFilter.Add(".jpg");

// Require
// using WinRT.Interop;
InitializeWithWindow.Initialize(picker, hwnd);

var file = await picker.PickSingleFileAsync();
if (string.IsNullOrWhiteSpace(file?.Path))
return;

var cd = new ContentDialog
{
Title = "Open File Dialog",
Content = new Image
{
Source = new BitmapImage
{
UriSource = new Uri(file.Path)
}
},
CloseButtonText = "OK"
};

cd.XamlRoot = this.Content.XamlRoot;
await cd.ShowAsync();
}
catch (Exception exception)
{
Console.WriteLine(exception);
}
}

#endregion

}

}

前回、わざわざ COM インターフェースを定義しましたが、そんなことは不要らしく、WinRT.Interop.WindowNative.GetWindowHandle メソッド を使えば Window ハンドルを取得できます。

それはさておき、 InitializeWithWindow.Initialize(picker, hwnd); は何をしているのでしょう?

MessageDialog、およびピッカー

によれば、IInitializeWithWindow::Initialize メソッド

Then call the interoperatability method IInitializeWithWindow::Initialize to parent the UI object that you want to display to the window that owns that HWND.

つまり、取得したウィンドウを表示するファイル選択ダイアログの親に設定している、というわけです。
Win32 API、WinForms に親しんできた開発者なら腹落ちする処理ですね。

app

ファイルを選択し

app

選択した jpg 画像を ContentDialog の上に表示させています。

Source Code

https://github.com/takuya-takeuchi/Demo/tree/master/WinUI/02_FileDialog