引起Silverlight白屏的原因
2011-11-20 15:57 slmk 阅读(2133) 评论(5) 编辑 收藏 举报白屏的原因大部分是因为"未捕获的异常"造成的。如果你建立的是“Silverlight 应用程序”而不是"导航应用程序“或”Bussiness应用程序“,那么恭喜你!你会经常遭遇白屏。因为调试时,未捕获的异常不会引起调试中断在出错的位置,而是引发应用程序的UnhandledException事件!然而“Silverlight 应用程序”模板的事件处理程序是这样的:
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
{
// 如果应用程序是在调试器外运行的
if (!System.Diagnostics.Debugger.IsAttached)
{
//出错后,会继续执行
e.Handled = true;
Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
}
// 如果应用程序是在调试时运行的,对不起直接白屏!这不坑爹吗?让人以为SL不成熟!
}
看到了吧?不会有任何错误提示,只是简单的白屏,自己加个MessageBox吧。建议平常还是建立“导航应用程序”或”Bussiness应用程序“,因为此模板的事件处理程序起码会给我们提示:
// 如果导航过程中出现错误,则显示错误窗口
private void ContentFrame_NavigationFailed(object sender, NavigationFailedEventArgs e)
{
e.Handled = true;
ChildWindow errorWin = new ErrorWindow(e.Uri);
errorWin.Show();
}
不过,此提示只会显示“未找到页面:”。因为:
public ErrorWindow(Uri uri)
{
InitializeComponent();
if (uri != null)
{
ErrorTextBox.Text = "未找到页面: \"" + uri.ToString() + "\"";
}
}
遭遇白屏源于自己写的较复杂的代码,里面用了大量的Dispatcher用来延迟处理一些界面布局,由于算法有些复杂,于是频繁遭遇白屏,起初以为是工作项排队太多造成UI主线程得不到CPU时间,停止响应响应造成的。然而,当我要模拟出这种情况引起的白屏时,却没有成功。我的实验代码是这样的:
void DoWork()
{
Dispatcher.BeginInvoke(new Action(DoWork));
Dispatcher.BeginInvoke(new Action(DoWork));
}
调用DoWork函数并不会引起白屏,它只会使你的应用程序慢慢的停止响应,界面固定不动!可以说,大部分白屏是由于出错造成的,并且出错的原因大多与Xaml代码有关,如果用了自定义控件,代码文件中的错误不会被调试器中断!
希望此文对SL新手有所帮助!