zoukankan      html  css  js  c++  java
  • 引起Silverlight白屏的原因

    白屏的原因大部分是因为"未捕获的异常"造成的。如果你建立的是“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新手有所帮助!

     

    提供Silverlight打印全套解决方案全部源代码--支持打印预览、页面设置(横向纵向,页边距,纸张大小、字体大小)、自动分页和多页连续打印



  • 相关阅读:
    数据机构与算法学习(四)- 链表
    DFS深度优先
    LeetCode.98验证二叉树
    输入一个有符号整数,输出该整数的反转值。
    如何交换两个对象
    泛型简介,泛型类及使用
    一个普通的逻辑问题
    for循环
    第一次比赛唯一ACCEPT的题目笑哭
    输入100以内具有10个以上因子的整数 并输出它的因子
  • 原文地址:https://www.cnblogs.com/slmk/p/2255816.html
Copyright © 2011-2022 走看看