2013-03-29 2 views
1

먼저 inkmanager 스트로크를 로컬 설정에 저장 한 다음 스트림 및 공유로 읽음으로써 InkManager 스트로크를 공유하는 응용 프로그램을 만듭니다.비트 맵 이미지와 HTML 컨텐트를 함께 공유 할 수 없습니까?

이제 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은 DataRequested 이벤트 핸들러 내부에 async 방법을 기다리고에 의해

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; 
    } 

답변

2

문제가 발생을 스트리밍 할 수 있습니다. 당신이이 일을하는 경우 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()을 호출하여 계속 신호를 보냅니다. 이 코드가 없으면 호출자는 실제로 비트 맵을 설정하기 전에 계속됩니다. 따라서 오류가 발생합니다.

편집 :

윈도우 8 메일 앱하지만, 이미지가 같이 공유의 공유 대상이 아닙니다. 메일 앱을 사용하려면 저장 항목으로 이미지를 공유해야합니다.

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

이제 메일이 사용 가능한 대상 중 하나로 표시됩니다. 이미지를 공유 할 때 SetBitmap()SetStorageItems()을 모두 사용하면 모든 앱이 두 가지 데이터 유형을 모두 지원하지는 않으므로 공유 대상을 더 많이 확보 할 수 있습니다.

편집 2 :

또한 메일 응용 프로그램은 (어떤 HTML이 제공되지 않은 경우) HTML 또는 StorageItems 당신은 이미 눈치 챘을 같이 공유 콘텐츠의 하나 개의 유형을 선택합니다. 내가 아는 유일한 해결 방법은, 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)); 

당신은 blog post by Mike Taulty에서이 방법에 대한 자세한 내용을보실 수 있습니다.

+0

공유 페이지에서도이 작업을 수행했지만 이미지가 첨부되지 않고 있습니다. 사진 폴더에는 저장되었지만 첨부되지는 않았습니다 ... –

+0

@BalrajSingh 어디에 첨부하고 싶습니까? 어떤 공유 대상을 염두에 두시겠습니까? –

+0

이메일 첨부해야하고이를 통해 보내야합니다. –

관련 문제