【问题标题】:Windows Phone 8.1 App crashes on ShowShareUI()Windows Phone 8.1 应用程序在 ShowShareUI() 上崩溃
【发布时间】:2014-11-07 09:44:49
【问题描述】:

我正在尝试向我的 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 而不是构造函数中。
  • 试过了。没有什么不同。
  • 把所有的函数都用try catch,并显示任何错误来查明错误,因为提供的东西不足以帮助你更多。
  • @W.K.S 现在试试我的答案,告诉我它是否有效。

标签: c# windows-phone-8.1


【解决方案1】:

我最近也遇到了这个问题。未设置重要参数之一时,共享 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();
}

【讨论】:

  • 感谢您的建议。我检查了网址,它们都很好。
  • 我添加了一些想法。如果以后有时间我会去试试你的代码。
  • 我尝试了你所有的 cmets,但没有一个有所作为。它仍然崩溃
  • @Fred 您是否尝试共享硬编码值?换句话说,为您遇到的问题构建一个最小示例,然后从那里着手。
  • @MarkusBruckner:你一定是弄错了。这不是我的问题;)我已经建议过了。
【解决方案2】:

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

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

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

【讨论】:

  • 这终于帮助我调试了这个问题。问题是我将对象作为 NavigationParameter 发送。我通过将对象转换为您推荐的字符串来修复它:D
  • @W.K.S 我也遇到了类似的问题,你能把关于对象的答案更新为字符串吗?
  • @mehul9595 在您的自定义对象中覆盖 tostring 方法或尝试使用来自newtonsoft.com/json 的库。 newtonsoft 是一个非常受欢迎的库。
  • @Mani:从上面的例子中更正确地理解,你的意思是不是这样做 this.article.Title (或任何其他字段),而是传递一个字符串表示形式?
  • @mehul9595 使用 newtonsoft 库,它将给出该对象的字符串表示形式。使用该字符串作为参数在页面之间发送。在接收页面中,使用库将该字符串转换回对象。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多