2017-03-17 81 views
3

我用單個按鈕創建了一個非常簡單的UWP應用程序。點擊它應該會顯示內置的共享彈出框共享一個PDF文件UWP共享功能在Windows 10中不起作用Mobile

事實上,我已經爲Windows 10(桌面)工作,但它不適用於手機(彈出窗口不顯示在屏幕上)。

PDF文件以字節數組的形式出現(因爲它來自遠程服務)。

這是MainPage.xaml.cs中

public sealed partial class MainPage : Page 
{ 
    public MainPage() 
    { 
     this.InitializeComponent(); 
     DataTransferManager.GetForCurrentView().DataRequested += OnDataRequested; 
    } 

    protected override async void OnNavigatedTo(NavigationEventArgs e) 
    { 
     // This should come from a service 
     PdfBytes = await Microsoft.Toolkit.Uwp.StorageFileHelper.ReadBytesFromPackagedFileAsync("Document.pdf"); 
    } 

    public byte[] PdfBytes { get; set; } 

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

     var si = await StorageFile.CreateStreamedFileAsync("Document.pdf", stream => 
     { 
      var writeStream = stream.AsStreamForWrite(); 
      writeStream.Write(PdfBytes, 0, PdfBytes.Length); 
      stream.Dispose();     
     }, null); 

     args.Request.Data.Properties.Title = "PDF Document"; 
     args.Request.Data.Properties.Description = "Some description"; 
     args.Request.Data.SetStorageItems(new IStorageItem[] { si }); 
     deferral.Complete(); 
    } 

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
    { 
     DataTransferManager.ShowShareUI(); 
    } 
} 

它是正確的代碼?如果不是,我應該如何分享PDF(從字節)?

+1

也許這個答案對您有用:http://stackoverflow.com/a/30203936/1406798 –

+0

嗨,在我的應用程序中,我也使用共享。它適用於Desktop和Mobil。區別在於:改爲新的IStorageItem [] {si}我使用了新的List list = new List (); list.Add(文件);其中File是StorageFile。檢查你的組件。你有移動擴展嗎?! – thezapper

回答

1

感謝您的反饋。看起來CreateStreamedFileAsync方法不適用於Mobile的Share合同。我們在內部記錄了這個問題,一旦有任何進展,我會在這裏更新。

現在,作爲一種變通方法,您可以將文件存儲在TemporaryFolder先喜歡分享如下:

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

    var tempFile = await ApplicationData.Current.TemporaryFolder.CreateFileAsync("Document.pdf", CreationCollisionOption.ReplaceExisting); 
    await FileIO.WriteBytesAsync(tempFile, PdfBytes); 

    args.Request.Data.Properties.Title = "PDF Document"; 
    args.Request.Data.Properties.Description = "Some description"; 
    args.Request.Data.SetStorageItems(new IStorageItem[] { tempFile }); 

    deferral.Complete(); 
} 

臨時應用的數據存儲是你不想要的數據在正確的地方在當前的應用會話之後仍然存在。系統可以根據需要刪除存儲在此位置的數據以釋放空間。您可以將其用於任何中間或臨時文件。如果您要將大量數據寫入Temp,則在初始化應用程序時清除它是個好主意,以避免系統或用戶不得不採取措施釋放存儲空間。你可以通過調用做到這一點:

await ApplicationData.ClearAsync(ApplicationDataLocality.Temporary); 
+0

我沒有得到何時以及如何調用OnDataRequested。我只有在使用ShowShareUI()時纔會調用它,但是會打開一些對話框1/2秒並立即關閉它。對話框中的消息顯示「此應用程序目前無法共享」。對話框關閉,然後調用我的OnDataRequested,但沒有任何反應。我正是在這裏解釋的https://stackoverflow.com/questions/46555117/uwp-datatransfermanager-showshareui-opens-sharing-dialog-with-this-app-cant – pixel

0

您也有類似的問題,我已經相信

你有沒有試圖改變

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

    var si = await StorageFile.CreateStreamedFileAsync("Document.pdf", stream => 
    { 
     var writeStream = stream.AsStreamForWrite(); 
     writeStream.Write(PdfBytes, 0, PdfBytes.Length); 
     stream.Dispose();  

     args.Request.Data.Properties.Title = "PDF Document"; 
     args.Request.Data.Properties.Description = "Some description"; 
     args.Request.Data.SetStorageItems(new IStorageItem[] { si }); 
     deferral.Complete(); 

    }, null); 
} 

我還沒有檢查這個代碼,因此它可能不會編譯,但如果涉及線程,我發現我的問題與您的看起來很相似。看看我的問題在這裏UWP DataTransferManager ShowShareUI() Opens Sharing Dialog with "This app can't share right now" and Closes it Immediately After