Windows Phone 8.1应用程序在ShowShareUI()时崩溃

5

我正在尝试为我的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中进行调试时,代码总是运行良好,但在其他情况下几乎从不正常工作。我尝试了发布构建版本,以为可能是调试版本中的某些代码引起问题,但这并没有改变任何事情。


尝试将RegisterForShare();设置在OnNavigatedTo中而不是构造函数中。 - Pedro.The.Kid
试过了,没什么不同。 - W.K.S
将所有的函数都加上try catch,并显示任何错误以准确定位错误,因为所提供的信息不足以帮助你更多。 - Pedro.The.Kid
@W.K.S 请现在尝试我的答案并告诉我它是否有效。 - Mani
3个回答

4
我最近也遇到了这个问题。当其中一个重要参数未设置时,共享界面会崩溃。在你的情况下,我怀疑是这种情况。
this.article.UrlDomain 

是空或不是有效的Uri模式。您应该在其周围构建if语句,并确保您正在处理真实的Uri。为了测试您的代码,您应该插入硬编码常量并再次运行它。如果它不崩溃,请逐个检查您的TitleSummaryUrlDomain

其他需要调查的地方:

尝试在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();
}

谢谢您的建议。我已经检查了这些URL,它们都没有问题。 - W.K.S
我加了一些想法。如果我晚些时候有时间,我会去尝试你的代码。 - Fred
我尝试了你所有的评论,但是它们都没有起到任何作用。它仍然崩溃。 - W.K.S
@Fred 你尝试过共享硬编码的值吗?换句话说,构建一个最小化的问题示例,并从那里开始解决。 - Markus Bruckner
@MarkusBruckner:您可能弄错了,这不是我的问题 ;) 我已经提过建议了。 - Fred
@Fred 是的,我是想评论这个问题。 - Markus Bruckner

1

我曾经遇到过类似的问题(在显示共享界面时崩溃)。 经过长时间的调查,我发现这是因为在SaveFrameNavigationState(来自模板项目的SuspensionManager类)中出现了未处理的异常。 在我的情况下,这是因为SessionStateForFrame方法在解析无法序列化的类时失败。 请检查在页面状态的SaveState中保存了什么。 这不仅会在ShowShareUI上发生,而且通常会在挂起模式下发生。


1

好的,我遇到了同样的问题。ShowShareUi实际上会暂停您的应用程序。如果您尝试暂停您的应用程序,您将收到错误。这实际上是序列化问题。

如果您想查看错误,那么在调试时,请按生命周期事件和暂停,现在您将在调试模式下崩溃。

suspend in debug mode

如果您正在使用自定义类在页面之间导航,您将会遇到错误。*我的建议是将其转换为json字符串发送并获取回来。*

这个终于帮我解决了问题。问题在于我将一个对象作为NavigationParameter发送了出去。但是我按照你的建议将对象转换成字符串后问题得到解决 :D - W.K.S
@W.K.S 我也遇到了类似的问题,你能否更新一下关于对象转字符串的答案? - mehul9595
@mehul9595 在您的自定义对象中覆盖 tostring 方法,或尝试使用 http://www.newtonsoft.com/json 中的库。newtonsoft 是一个非常流行的库。 - Mani
@Mani:从上面的例子更准确地理解,你是指代替使用 this.article.Title(或任何其他字段),传递一个字符串表示吗? - mehul9595
@mehul9595 使用newtonsoft库,它会给出该对象的字符串表示形式。使用该字符串作为参数在页面之间发送。在接收页面中,使用库将该字符串转换回对象。 - Mani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接