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

时间:2014-11-07 09:44:50

标签: c# windows-phone-8.1

我正在尝试向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调试时,代码总能正常工作,但绝不是这样。我做了一个发布版本,认为调试版本中可能有一些代码导致问题,但这并没有任何区别。

3 个答案:

答案 0 :(得分:4)

我最近也遇到过这个问题。当未设置其中一个重要参数时,共享UI崩溃。在你的情况下,我怀疑

this.article.UrlDomain 

为null或不是有效的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();
}

答案 1 :(得分:1)

我遇到过类似问题(ShowShareUI崩溃)。 经过长时间的调查,我发现,这是因为SaveFrameNavigationState(来自模板项目的SuspensionManager类)中的未处理异常。 在我的情况下,这是因为SessionStateForFrame方法在解析无法序列化的类时失败。 在页面的SaveState上查看您在页面状态中保存的内容。 它不仅发生在ShowShareUI上,而且一般发生在挂起模式下。

答案 2 :(得分:1)

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

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

suspend in debug mode

如果您使用自定义类在页面之间导航,则会出错。 *我的建议是你会转换为 jsonstring 并发送并取回它。*