概要
- .NET 6.0 な WPF アプリで、User アカウントに設定された画像を取得して、XAMLで表示する。
- 画像の取得は、WinRT な Windows.System.User.GetPropertyAsync で行う。
- GetPropertyAsync で取得した IRandomAccessStreamReference を WPF の BitmapImage に変換して表示する。
- サンプルアプリケーションはこちら。
ユーザ情報の取得
-
UWPでユーザー名を取得する - かずきのBlog@hatena にあるように、ログインしているユーザー情報は、Windows.System.User で取得します。
- Msix Packaging プロジェクトを作成して、Package.appxmanifest で、<uap:Capability Name="userAccountInformation"/> しておきます。
- Windows.System.User は、Windows.System の namespace 配下の WinRT な API なので、WPF で利用するには、下記の記事にあるように、NuGet の Microsoft.Windows.SDK.Contracts パッケージをインストールします。
IRandomAccessStreamReference を BitmapImage に変換して表示する
User.GetPictureAsync の See also で紹介されている、Windows-universal-samples/Samples/UserInfo/ では、下記のようなコードで BitmapImage に変換していますが、この場合(UWP)のBitmapImage は、Windows.UI.Xaml.Media.Imaging.BitmapImage で、WPF の System.Windows.Media.Imaging.BitmapImage では、BitmapImage.SetSource が存在せず、WPFおいてそのままでは使えません。
IRandomAccessStreamReference streamReference = await user.GetPictureAsync(UserPictureSize.Size64x64);
if (streamReference != null)
{
IRandomAccessStream stream = await streamReference.OpenReadAsync();
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(stream);
ProfileImage.Source = bitmapImage;
}
そこで、C# converting UWP BitmapImage to WPF BitmapImage で回答されているように、Stream に変換してから BitmapImage.StreamSource に設定することで、WPF で表示できるようになります。
var user = (await User.FindAllAsync(UserType.LocalUser, UserAuthenticationStatus.LocallyAuthenticated)).FirstOrDefault();
// C# converting UWP BitmapImage to WPF BitmapImage
// https://stackoverflow.com/questions/50596735/c-sharp-converting-uwp-bitmapimage-to-wpf-bitmapimage
IRandomAccessStreamReference streamReference = await user.GetPictureAsync(UserPictureSize.Size208x208);
if (streamReference != null)
{
var bitmap = new BitmapImage();
using var randomAccessStream = await streamReference.OpenReadAsync();
using var stream = randomAccessStream.AsStream();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.EndInit();
UserPicture.Value = bitmap;
}
サンプルコード
詳細は、サンプルアプリケーション を見てください。
実行すると下記の画像のようにログインしているユーザーのプロフィール画像が表示されます。