我正在尝试向Windows Phone应用添加共享功能。代码以不可预测的方式运行。有时候它有效,但大部分时间都没有,而且我还没有能够获得导致崩溃的原因。有人可以通过下面的代码告诉我,如果我错过了什么?谢谢!
public ArticlePage()
{
this.InitializeComponent();
//..
RegisterForShare();
}
private void RegisterForShare()
{
DataTransferManager dataTransferManager = DataTransferManager.GetForCurrentView();
dataTransferManager.DataRequested += new TypedEventHandler<DataTransferManager,
DataRequestedEventArgs>(this.ShareLinkHandler);
}
private void ShareLinkHandler(DataTransferManager sender, DataRequestedEventArgs e)
{
DataRequest request = e.Request;
DataRequestDeferral defferal = request.GetDeferral();
request.Data.Properties.Title = this.article.Title;
request.Data.Properties.Description = this.article.Summary;
request.Data.SetWebLink(new Uri(this.article.UrlDomain));
defferal.Complete();
}
private void ShareCommand_Click(object sender, RoutedEventArgs e)
{
DataTransferManager.ShowShareUI();
}
更新
在我从visual studio调试时,代码总能正常工作,但绝不是这样。我做了一个发布版本,认为调试版本中可能有一些代码导致问题,但这并没有任何区别。
答案 0 :(得分:4)
我最近也遇到过这个问题。当未设置其中一个重要参数时,共享UI崩溃。在你的情况下,我怀疑
this.article.UrlDomain
为null或不是有效的Uri模式。你应该围绕它建立一个if子句,并确保你正在处理一个真正的Uri。要测试代码,您应该插入硬编码常量并再次运行它。如果它没有崩溃,请逐个检查您的Title
,Summary
和UrlDomain
。
其他需要调查的地方:
尝试在OnNavigatedTo方法中添加处理程序,并在离开页面时将其删除
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
DataTransferManager.GetForCurrentView().DataRequested += SharePage_DataRequested;
}
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
{
base.OnNavigatingFrom(e);
DataTransferManager.GetForCurrentView().DataRequested -= SharePage_DataRequested;
}
我还搜索了我的代码,再次查看了官方样本,没有找到任何默认。只是为了确定 - 如果我是你,我会在我的代码中删除所有不合适的行,并尽可能地将其放到官方示例中,然后将其扩展回原来的位置,这就是为什么我要将这两行注释掉线条:
void SharePage_DataRequested(DataTransferManager sender, DataRequestedEventArgs args)
{
DataRequest request = e.Request;
//DataRequestDeferral defferal = request.GetDeferral();
request.Data.Properties.Title = this.article.Title;
request.Data.Properties.Description = this.article.Summary;
request.Data.SetWebLink(new Uri(this.article.UrlDomain));
//defferal.Complete();
}
答案 1 :(得分:1)
我遇到过类似问题(ShowShareUI崩溃)。 经过长时间的调查,我发现,这是因为SaveFrameNavigationState(来自模板项目的SuspensionManager类)中的未处理异常。 在我的情况下,这是因为SessionStateForFrame方法在解析无法序列化的类时失败。 在页面的SaveState上查看您在页面状态中保存的内容。 它不仅发生在ShowShareUI上,而且一般发生在挂起模式下。
答案 2 :(得分:1)
好的,我遇到了同样的问题。 ShowShareUi实际上会暂停您的应用。如果您尝试暂停您的应用程序,您将收到错误。这实际上是序列化问题。
如果你想查看错误,那么在调试时,按下生命周期事件并暂停,你现在将在调试模式下崩溃。
如果您使用自定义类在页面之间导航,则会出错。 *我的建议是你会转换为 jsonstring 并发送并取回它。*