1

最初に inkmanager ストロークをローカル設定に保存し、それをストリームとして読み取って共有することで、InkManager ストロークを共有するアプリケーションを作成しています。

HTML コンテンツが共有されるようになりましたが、メールに画像が添付されていません。HTMLを共有するコードにコメントすると、メールアプリで共有しているときに画像が添付されます。しかし、両方が一度に共有されるわけではありません。どうすればこれを達成できますか???

コード:

DataPackage requestData = request.Data;
                requestData.Properties.Title =        this.PageViewModel.JobInformationDetail.JobNumber;
                requestData.Properties.Description = this.PageViewModel.JobInformationDetail.CustomerSignatureName;
                //requestData.SetText("Sample Text");

                RandomAccessStreamReference signatureStream = await GetInkManagerStream();

                if (signatureStream != null)
                {
                    requestData.SetBitmap(signatureStream);
                }

                requestData.SetHtmlFormat(Windows.ApplicationModel.DataTransfer.HtmlFormatHelper.CreateHtmlFormat(this.GetMailDescription()));

InkManager をストリームに変換する

private async Task<RandomAccessStreamReference> GetInkManagerStream()
    {
        IRandomAccessStream signatureStream = null;

        StorageFile myMerge = await ApplicationData.Current.LocalFolder.CreateFileAsync("sign.png", CreationCollisionOption.OpenIfExists);
        IOutputStream signature = await myMerge.OpenAsync(FileAccessMode.ReadWrite);

        if (signature != null)
        {
            await _inkManager.SaveAsync(signature);
            signature.Dispose();
        }

        signatureStream = await myMerge.OpenAsync(FileAccessMode.ReadWrite);
        RandomAccessStreamReference streamRef = RandomAccessStreamReference.CreateFromStream(signatureStream);
        signatureStream.Dispose();

        return streamRef;
    }
4

1 に答える 1

2

この問題は、イベント ハンドラーasync内でメソッドを待機していることが原因で発生します。DataRequestedこれを行っている場合は、次を使用する必要がありますDataRequestReferral

private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    var deferral = args.Request.GetDeferral();

    // the rest of your method, including the awaiting call

    deferral.Complete();
}

これを行うことで、続行する前に非同期呼び出しが完了するまで待機する必要があることを呼び出し元に伝えます。最後に、 を呼び出して続行するように通知しますdeferral.Complete()。それがないと、実際にビットマップを設定する前に呼び出し元が続行するため、エラーが発生します。

編集:

ただし、Windows 8 のメール アプリは、このように共有される画像の共有対象ではありません。メール アプリを使用できるようにするには、画像をストレージ アイテムとして共有する必要があります。

var file = await ApplicationData.Current.LocalFolder.GetFileAsync(@"sign.png");
var imageItems = new List<IStorageItem>();
imageItems.Add(file);
requestData.SetStorageItems(imageItems);

これで、メールが利用可能なターゲットの 1 つとして表示されます。すべてのアプリが両方のデータ タイプをサポートしているわけではないため、画像を共有する場合は、両方を使用SetBitmap()し、より多くの共有ターゲットを利用できるようにすることをお勧めします。SetStorageItems()

編集2:

また、既にお気づきのように、Mail アプリは、HTML または StorageItems (HTML が提供されていない場合) のいずれかの 1 種類の共有コンテンツのみを取得します。私が知っている唯一の回避策は、画像を HTML コンテンツに埋め込むことです。

var resourceName = "logo.png";
var html = String.Format("<p>HTML content</p><img src='{0}'/>", resourceName);
requestData.ResourceMap[resourceName] = RandomAccessStreamReference.CreateFromUri(
    new Uri("ms-appdata:///local/sign.png"));
requestData.SetHtmlFormat(HtmlFormatHelper.CreateHtmlFormat(html));

このアプローチの詳細については、Mike Taulty によるブログ投稿を参照してください

于 2013-03-30T06:10:26.977 に答える