我的应用已在App Hub中发布。但我收到一个错误报告说,由于GuideAlreadyVisibleException导致崩溃。 我使用指南来显示自定义消息。什么是这个例外,什么时候引起?我无法重现设备中的崩溃。
这就是我使用指南消息的方式
if (pCycMan.GetStartDate() == pCycMan.GetDefaultDate())
{
Guide.BeginShowMessageBox(resMan.GetString("msgboxWelcomeStringHeader"), resMan.GetString("msgboxWelcomeStringDescription1") + "\n" + resMan.GetString("msgboxWelcomeStringDescription2"),
new string[] { resMan.GetString("msgBoxWelcomeOk"), resMan.GetString("appBarIconFAQText") }, 1, MessageBoxIcon.None, new AsyncCallback(OnMessageBoxClosed), null);
}
else if (pCycMan.GetCycleStartDelay() > 0)
{
if (pCycMan.IsCyclePaused())
{
Guide.BeginShowMessageBox(resMan.GetString("msgboxCycleDelayPromptHeader"), resMan.GetString("msgboxCyclePausedPromptDescription") + "\n" + resMan.GetString("msgboxCycleDelayPromptDescription3"),
new string[] { resMan.GetString("msgBoxWelcomeOk"), resMan.GetString("appBarIconFAQText") }, 1, MessageBoxIcon.None, new AsyncCallback(OnMessageBoxClosed), null);
}
else
{
String delayMsg = resMan.GetString("msgboxCycleDelayPromptDescription1") + " " + pCycMan.GetCycleStartDelay().ToString() + " " + resMan.GetString("msgboxCycleDelayPromptDescription2")+ "\n" + resMan.GetString("msgboxCycleDelayPromptDescription3") ;
Guide.BeginShowMessageBox(resMan.GetString("msgboxCycleDelayPromptHeader"), delayMsg,
new string[] { resMan.GetString("msgBoxWelcomeOk"), resMan.GetString("appBarIconFAQText") }, 1, MessageBoxIcon.None, new AsyncCallback(OnMessageBoxClosed), null);
}
}
和
private void OnMessageBoxClosed(IAsyncResult msgboxresult)
{
int? buttonIndex = Guide.EndShowMessageBox(msgboxresult);
switch (buttonIndex)
{
case 0:
break;
case 1:
Deployment.Current.Dispatcher.BeginInvoke(() => NavigateToHelpPage());
break;
}
}
答案 0 :(得分:1)
当另一个提示尝试打开时,当指南显示的消息框,输入框或任何其他提示处于打开,可见或仍然关闭时,可能会发生此问题。
两个可能的示例是,如果您的应用程序在用户单击按钮后显示消息框。如果用户在显示提示之前非常快地单击按钮两次,或者用户在第一个提示一直关闭之前再次单击该按钮,则会抛出异常。
我在某些应用程序中通过在显示任何提示之前添加对帮助程序方法的调用来避免此问题。我已经包含了一个执行类似于我的帮助方法的功能的代码片段。我还添加了一个检查,以避免无限循环,只让它运行3秒,之后我让应用程序崩溃,如果它需要(但希望它不会)。
public static void GuideSafetyWait(int maxDuration)
{
DateTime timeStarted = DateTime.Now;
while (Guide.IsVisible)
{
if ((DateTime.Now - timeStarted).TotalMilliseconds >= maxDuration)
break; // Prevent infinite loop.
Thread.Sleep(10); // This could be any number of milliseconds, but
// if its too high, it may deliver a poor user experience.
}
}