Windows Phone 8 Toolkit中的CustomMessageBox抛出NullPointerException

时间:2013-01-07 09:26:14

标签: c# windows-phone windows-phone-8

创建CustomMessageBox的代码:

CustomMessageBox是一个属性,而不是对Toolkit中C#类的引用。

CustomMessageBox.Dismissed += (dismissSender, dismissedEvent) =>
{
    switch (dismissedEvent.Result)
    {
        case CustomMessageBoxResult.LeftButton:
            PlaceCall(clickedFavorite.Name, clickedFavorite.PhoneNo);
            break;
        case CustomMessageBoxResult.RightButton:
            HERE ---> SendText(clickedFavorite.PhoneNo);
            break;
    }
};

SendText()方法的代码:

private void SendText(String phoneNo)
{
    var smsTask = new SmsComposeTask
                      {
                          To = phoneNo
                      };

    smsTask.Show();
}

事情是SmsComposeTask启动时,手机导航到SMS应用程序,这是正确的。

如果用户随后决定返回,使用硬件后退按钮,SMS应用程序关闭,手机再次显示我的应用程序 - 但会立即关闭,由NullPointerException引起:

   at Microsoft.Phone.Controls.CustomMessageBox.ClosePopup(Boolean restoreOriginalValues)
   at Microsoft.Phone.Controls.CustomMessageBox.<>c__DisplayClass4.<Dismiss>b__1(Object s, EventArgs e)
   at Microsoft.Phone.Controls.Transition.OnCompleted(Object sender, EventArgs e)
   at MS.Internal.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, Int32 actualArgsTypeIndex, String eventName)

我还试图覆盖OnBackKeyPress事件,如下所示:

protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e)
{
    if (CustomMessageBox != null && CustomMessageBox.IsEnabled)
    {
        e.Cancel = true;
    }
    else
    {
        base.OnBackKeyPress(e);
    }
}

有谁知道该怎么做?

7 个答案:

答案 0 :(得分:2)

我找到了解决自己问题的方法。我没有使用有问题的CustomMessageBox,而是找到了Coding4Fun Windows Phone Toolkit,它提供了一个名为MessagePrompt的迄今为止更稳定的消息框 - 以下是如何使用它。

创建按钮

var smsButton = new Button { Content = "SMS" };
smsButton.Click += (o, args) =>
{
    // do something
};

var buttonList = new List<Button>
{
    smsButton
};

创建实际的消息提示

var msgPrompt = new MessagePrompt
{
    Title = "Message Prompt Title",
    Body = new TextBlock { Text = "Text for the Body", FontSize = 25, TextWrapping = TextWrapping.Wrap },
    ActionPopUpButtons = buttonList
};

显示

msgPrompt.Show()

没有公牛

我对此MessagePrompt所体验到的好处是,您不必使用两个静态按钮,例如{{1} }}

如果您愿意,可以将CustomMessageBox属性设置为一个全新的XAML页面,这使得该控件更加灵活。

参考:Coding4Fun WP7 Message Prompt in depth

答案 1 :(得分:1)

此问题与Windows Phone应用程序生命周期无关。可以找到here, figure 6。当程序处于活动状态时激活另一个程序时,您应该保存所有应用程序数据,这样当重新激活事件(例如使用后退按钮导航回应用程序)再次启动程序时,您可以再次加载用户数据。

答案 2 :(得分:1)

我不确定发生了什么,但您可以延迟短信任务以避免此问题:

CustomMessageBox.Dismissed += (dismissSender, dismissedEvent) =>
{
    switch (dismissedEvent.Result)
    {
        case CustomMessageBoxResult.LeftButton:
            PlaceCall(clickedFavorite.Name, clickedFavorite.PhoneNo);
            break;
        case CustomMessageBoxResult.RightButton:
            Dispatcher.BeginInvoke(new Action(() => SendText(clickedFavorite.PhoneNo)));
            break;
    }
};

答案 3 :(得分:1)

我的0.02 $:这是CustomMessageBox中的一个错误。他们在那里留下了很多单身人士,而且一个好的时间错误并不能成为一个好的世界。同意KooKiz,如果不修复CustomMessageBox或等到CustomMessageBox完成它的事情,你就无法解决这个问题。从我的临时测试开始,它需要2-6 Dispatcher.BeginInvoke()之间的任何地方,直到这些操作完成。相反,也许可以考虑使用DispatcherTimer并等待256MS,这应该是足够的时间。

private void MainPage_Loaded(object sender, RoutedEventArgs e)
{
    var msgBox = new CustomMessageBox()
                 {
                     Caption = "foo",
                     Message = "bar",
                     LeftButtonContent = "baz",
                     RightButtonContent = "goo",
                     IsFullScreen = false,

                 };


    msgBox.Dismissed += (s, args) =>
    {
        DispatcherTimerHelper.InvokeReallySoon(() =>
        {
            new SmsComposeTask()
            {
                Body = "foo",
                To = "bar"
            }.Show();
        });

    };

    msgBox.Show();
}


public static class DispatcherTimerHelper
{
    public static void InvokeReallySoon(Action action)
    {
        var t = new DispatcherTimer() {Interval = TimeSpan.FromMilliseconds(256)};
        t.Tick += (s, args) => action();
        t.Start();
    }
} 

答案 4 :(得分:0)

问题恰好发生在wp8中。 我在wp7中使用相同的代码,没有任何错误发生。

使用Code4fun messagebox是一个不错的选择,但需要调用Button Click处理程序

  MessagePrompt.Hide();

关闭MessagePrompt。

答案 5 :(得分:0)

在dismissed事件上使用布尔值来定义按下了哪个按钮。然后我实现了我将在Unloaded事件中的dismissed事件中实现的代码。这似乎解决了这个问题。

    messageBox.Dismissed += (s1, e1) =>
    {
        switch (e1.Result)
        {
            case CustomMessageBoxResult.LeftButton:
                {
                    delete = true ;
                }
                break;
            case CustomMessageBoxResult.RightButton:
                break;
            case CustomMessageBoxResult.None:
                break;
            default:
                break;
        }
    };

    messageBox.Unloaded += (s1, e1) =>
    {
        if (delete)
            DeleteWorkout();
    };

答案 6 :(得分:0)

这是一个已知的错误。 它已在最新版本中修复。 删除引用并再次安装工具包。