我正在尝试从运行在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;。
答案 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");
请更改您的代码并尝试再次运行您的应用,看看您是否仍然面临此问题。