2

创建代码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 应用程序将关闭并且手机再次显示我的应用程序 - 但立即关闭,由 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);
    }
}

有谁知道该怎么做?

4

7 回答 7

2

我找到了解决我自己问题的方法。CustomMessageBox我找到了 Coding4Fun Windows Phone Toolkit ,而不是使用 faulty ,它提供了一个迄今为止更稳定的消息框,称为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,您不必像 with 那样绑定到两个静态的左右按钮。CustomMessageBox

如果需要,您可以将该Body属性设置为一个全新的 XAML 页面,这使得该控件具有灵活性。

参考:Coding4Fun WP7 消息提示深入

于 2013-01-09T12:40:29.340 回答
1

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

于 2013-01-07T09:50:33.760 回答
1

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

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;
    }
};
于 2013-01-07T10:00:13.870 回答
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();
    }
} 
于 2013-01-09T01:15:01.300 回答
0

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

使用 Code4fun 消息框是一个不错的选择,但是你需要调用的是 Button Click handler

  MessagePrompt.Hide();

关闭消息提示。

于 2013-05-08T13:11:24.567 回答
0

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

IE

    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();
    };
于 2013-06-18T21:43:43.700 回答
0

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

于 2013-06-30T13:19:56.033 回答