创建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);
}
}
有谁知道该怎么做?
答案 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页面,这使得该控件更加灵活。
答案 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)
这是一个已知的错误。 它已在最新版本中修复。 删除引用并再次安装工具包。