[WinRT] Image コントロールに表示している画像を保存するポップアップメニュー

Mevy で使用している画像を保存するポップアップメニューを表示するコード。
多少余計なものも混じってますが参考に。

private async void Image_Holding(object sender, HoldingRoutedEventArgs e)
{
    e.Handled = true;
    if (e.HoldingState != HoldingState.Started) { return; }
 
    await ImageMenu(e.GetPosition(null), (Image)sender);
}
 
private async void Image_RightTapped(object sender, RightTappedRoutedEventArgs e)
{
    e.Handled = true;
    if (e.PointerDeviceType != PointerDeviceType.Mouse) { return; }
 
    await ImageMenu(e.GetPosition(null), (Image)sender);
}
 
private async Task ImageMenu(Point touchedPoint, Image image)
{
    var resourceLoader = new ResourceLoader();
    var menu = new PopupMenu();
 
    // 画像を保存
    menu.Commands.Add(new UICommand(resourceLoader.GetString("Save"), async _ =>
    {
        var bmp = (BitmapImage)image.Source;
        var filename = Path.GetFileName(bmp.UriSource.AbsolutePath.Replace(":large", ""));
        if (string.IsNullOrEmpty(filename))
        {
            filename = "image";
        }
        var extension = Path.GetExtension(filename);
        var client = new HttpClient();
        var response = await client.GetAsync(bmp.UriSource);
        if (string.IsNullOrEmpty(extension))
        {
            extension = response.Content.Headers.ContentType.MediaType.Replace("image/", ".");
        }
 
        var picker = new FileSavePicker();
        picker.FileTypeChoices.Add(extension.Substring(1).ToUpper(), new List<string>() { extension });
        picker.SuggestedFileName = filename;
        picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
 
        var file = await picker.PickSaveFileAsync();
        if (file == null) { return; }
 
        var buffer = await response.Content.ReadAsBufferAsync();
        await FileIO.WriteBufferAsync(file, buffer);
    }));
 
    var length = 30;
    await menu.ShowForSelectionAsync(new Rect(touchedPoint.X - length, touchedPoint.Y - length, length * 2, length * 2));
}

カテゴリー: Windows ストア アプリ タグ: , パーマリンク