UWP DataTransferManager ShowShareUI()用&#34打开共享对话框;此应用现在无法共享"并立即关闭它

时间:2017-10-03 23:57:21

标签: uwp windows-10-universal data-sharing

我正在尝试从运行在Windows 10桌面上的UWP应用沙箱中共享文件。

在此页面上的MS文档之后,实现似乎相当直接;但是,我遇到了问题https://docs.microsoft.com/en-us/windows/uwp/app-to-app/share-data

我根据文章中的说明在我班级的c-tor中创建了DataTransferManager和附加的DataRequested事件:

DataTransferManager dataTransferManager;

public MainPage()
{
  this.InitializeComponent();
  ...
    dataTransferManager = DataTransferManager.GetForCurrentView(); 
    dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); 
}

接下来,在从后台线程调用的方法中,我调用ShowShareUI确保它在主线程上执行

Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
{
    DataTransferManager.ShowShareUI(); //THIS CALL SHOWS A POPUP AND IMMEDIATELLY CLOSES IT
}).AsTask().Wait();

然后在我的OnDataRequested事件中,我添加了我想要共享的文件:

private async void OnDataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
    // get the file from application sandbox
    StorageFile attachmentFile = await StorageFile.GetFileFromPathAsync(@"C:\Users\ME\AppData\Local\Packages\f040f23f-....-84\LocalState\logs\MYLOG.log");
    DataRequest request = args.Request; 
    request.Data.Properties.Title = "My Log File";
    request.Data.Properties.Description = "Sharing MYLOG file.";
    List<IStorageItem> storage = new List<IStorageItem>()
    {
        attachmentFile
    };
    request.Data.SetStorageItems(storage);
}

但没有任何反应。我没有机会在打开1/2秒并关闭的对话框中选择任何内容。以下是对话框的外观,它在打开后几乎立即打开和关闭,只显示&#34;此应用现在无法分享&#34;。

enter image description here

2 个答案:

答案 0 :(得分:3)

想出来,以下是我的问题的解决方案。

在MainPage.xaml.cs中添加了全局变量:

private DataTransferManager dataTransferManager;

在MainPage的构造函数中,添加了这个

dataTransferManager = DataTransferManager.GetForCurrentView(); 
dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager, DataRequestedEventArgs>(this.OnDataRequested); 

到目前为止,我的代码没有改变,但接下来调用ShowShareUI,并且该调用最初是从后台线程调用的,但是使用Dispatcher调度到UI线程(参见原始帖子)。我仍然不知道为什么这样做,因为我原来解释不起作用,但在更改下面的代码后,它现在正在工作。因此,在按钮点击按钮线程上启动共享:

private void Button_Click()
{
  DataTransferManager.ShowShareUI();
}

此事件处理程序由上面对ShowShareUI()的调用触发:

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

    // MyLogger has SendLogs method but calling this in Button_Click above will not work and the Share
    // dialog will just open and close.  Moving it down to this event solves the issue.
    MyLogger.SendLogs(async logpath =>
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
        {
            StorageFile myFile = await StorageFile.GetFileFromPathAsync(logpath);

            DataRequest request = args.Request; 
            request.Data.Properties.Title = "Share My Logs";
            request.Data.Properties.Description = string.Format("Share log file {0}.", myFile.DisplayName);

            List<IStorageItem> myStorageItems = new List<IStorageItem>() { myFile };
            request.Data.SetStorageItems(myStorageItems);
            deferral.Complete();
        });
    });
}

这解决了我的问题

答案 1 :(得分:1)

  

StorageFile attachmentFile = await StorageFile.GetFileFromPathAsync(@“C:\ Users \ ME \ AppData \ Local \ Packages \ f040f23f -....- 84 \ LocalState \ logs \ MYLOG.log”);

在UWP中,您无法直接从路径获取文件。

  

UWP应用程序以沙盒形式运行,并且对文件系统的访问权限非常有限。在大多数情况下,他们只能直接访问他们的安装文件夹和他们的应用程序数据文件夹。他们无权访问其他地方的文件系统。 Rob在他的博客Skip the path: stick to the StorageFile

中解释了这一点

因此,您的代码将更改如下:

StorageFolder logsFolder = await ApplicationData.Current.LocalFolder.GetFolderAsync("logs");
StorageFile file = await logsFolder.GetFileAsync("MYLOG.log");

请更改您的代码并尝试再次运行您的应用,看看您是否仍然面临此问题。