📜  应用程序,资源和部署

📅  最后修改于: 2020-11-19 08:36:25             🧑  作者: Mango


在本章中,我们将研究有关创建和部署应用程序以及所需资源的常见问题。

加载插件

运行Silverlight应用程序的最低要求是托管网页,该网页包含一个用于加载Silverlight插件的对象标签以及已编译的Silverlight内容本身。

如您所见,我们在object标签中使用了param标签来指向内容。

  • HTML 标签

    我们还可以传递其他参数来控制功能,例如在下载内容时显示的用户界面,在发生错误时运行的JavaScript代码以及在未安装Silverlight时显示的后备内容。

    HTML中的

    这是一个示例对象标签,它加载了一些Silverlight内容。您之前已经看过这一点,但是我们将更详细地看一些事情,从object标签本身的属性开始。

    类型属性

    type属性包含一个MIME类型,将该类型标识为Silverlight元素。这就是浏览器知道我们正在使用哪种嵌入式内容的方式。对象标签非常灵活。它不仅适用于插件。您可以使用它来托管嵌入式图像或HTML,以及基于插件的内容,例如Silverlight或Flash。

    如果安装了Silverlight插件,则会加载它。如果不是,则标准格式行为是使浏览器呈现对象标记内的任何HTML内容,就好像对象标记和参数标记不存在一样。

    资料属性

    下一个属性data不太明显。末尾的逗号注定会出现。一些重要的功能是-

    • 从技术上来说,此属性不是必需的,但Microsoft建议您添加它,因为某些Web浏览器在加载插件时会有相当令人惊讶的行为。

    • object标签旨在承载嵌入式内容,因此浏览器希望包含二进制字符串,位图文件或视频,音频流或其他内容。

    • 通常,您通常希望在data属性中放置一个URL,然后由浏览器下载该数据,并将其传递给插件。

    • data属性带有一个URI,通常它将指向某些数据,例如JPEG文件,但是在这里,我们使用的是一个稍微不寻常的URI方案。

    标签

    从源param开始,对象内部有各种param标签。

    
    

    它提供了从何处下载Silverlight内容的插件。

    您应该提供一个JavaScript错误处理程序。如果下载过程失败,将调用此方法。一旦Silverlight代码启动并运行,如果引发了未处理的异常,也将调用该方法。

    
    

    因此,这不仅是针对负载故障。您还应该指定代码所需的最低Silverlight版本。

    Microsoft鼓励用户保持最新状态,因此,一旦计算机上安装了Silverlight插件,就会通过Windows更新提供新版本,但是用户始终有可能运行的版本比您要求的版本更早。 。

     
     
    

    使用此minRuntimeVersion参数可以说出所需的版本。如果安装的版本较旧,则将调用onError处理程序。

    Silverlight将数字错误代码传递给错误处理JavaScript函数,并且出现一个明显的错误代码“ 8001 ”,以指示该插件已过期。

    您可以编写JavaScript代码来响应该问题,也可以只要求插件为您尝试升级。

    在这里, autoUpgrade参数设置为’ True ‘,这意味着,如果安装的插件已过期,Silverlight将自动显示一条消息,告诉用户需要更新的版本,并为他们安装。

    后备HTML内容

    如果未安装Silverlight,则将在param标记之后,使用要使用的后备HTML内容

    MIME类型未知的对象标签的标准浏览器行为是好像根本没有对象和param标签一样。因此,该标签及其内容将在没有Silverlight插件的系统中显示。

    请注意go.microsoft.com网站的两个URL,一个超链接和一个图像。

    图像链接解析为带有某些Silverlight品牌和一些提供安装Silverlight的文本的位图。超链接的端点是中等智能的。服务器检查用户代理以确定重定向到的位置。

    它可能会提供Silverlight Install可执行文件,或者如果用户使用不受支持的平台,它将把浏览器定向到包含有关Silverlight信息的页面。

    Silverlight.js

    除了HTML对象标签以外,还可以使用其他方法来加载Silverlight内容。 Microsoft提供了一个名为Silverlight.js的JavaScript文件,该文件允许从浏览器脚本管理加载过程。

    当您创建一个Web项目来承载一个新创建的Silverlight项目时,Visual Studio将添加一个副本。 Silverlight SDK也包含此文件的副本。

    Silverlight.js的主要优点是,在未安装Silverlight的情况下,它具有更大的灵活性。

    XAML资源

    Silverlight还提供了一种在XAML中创建对象资源的机制。通常可以通过XAML纠正某些类型的对象,您可能希望能够在应用程序的多个位置使用它们。想要在多个地方使用模板是很常见的。

    如果为按钮定义了自定义外观,则可能需要将其应用于多个按钮,甚至可能应用到应用程序中的所有按钮。 XAML资源系统提供了一种方法。您可以定义一个命名资源,然后在XAML中的其他地方使用它。

    除了模板之外,通常还希望对图形资源(例如画笔和形状)执行此操作。如果在应用程序中使用了特定的配色方案,则可以将该方案的颜色和画笔定义为资源。

    这是SolidColorBrush资源的简单应用程序。

    
       
        
           
        
        
        
           
              
              
           
        
        
    
    

    在上面的XAML代码,你可以看到,这两个矩形具有静态资源brushResource的颜色是艾莉斯蓝

    编译并执行上述代码后,您将看到以下输出。

    XAML资源

    应用程式

    所有Silverlight应用程序都有一个名为App.xaml的文件。它包含应用程序范围的信息。例如,它具有资源属性,就像用户界面元素一样。

    您在App.xaml文件中定义的资源可用于项目中的所有XAML文件。因此,我们可以将它们移到应用程序范围内,而不是使我的MainPage.xaml变得混乱不堪。

     
        
        
           
       
        
    
    

    应用类别

    像大多数XAML文件一样, App.xaml文件及其后面的相应代码定义了一个类。该Application类是Silverlight应用程序的入口点。 App.xaml通常处理应用程序范围资源。其文件后面的代码包含启动和关闭处理代码。

    • 创建Application类的实例后不久,Silverlight引发其Application.Startup事件。

    • 在这里,我们创建用户界面。我们期望在Startup事件中创建一个用户界面元素,并将其分配给应用程序对象RootVisual属性,该元素将成为Silverlight插件显示的用户界面。

    public partial class App : Application { 
     
       public App() { 
          this.Startup += this.Application_Startup; 
          this.Exit += this.Application_Exit; 
          this.UnhandledException += this.Application_UnhandledException;  
          InitializeComponent(); 
       }  
        
       private void Application_Startup(object sender, StartupEventArgs e) { 
          this.RootVisual = new MainPage(); 
       } 
        
       private void Application_Exit(object sender, EventArgs e) {}  
        
       private void Application_UnhandledException(object sender, 
          ApplicationUnhandledExceptionEventArgs e) { 
            
          if (!System.Diagnostics.Debugger.IsAttached) { 
             e.Handled = true; 
             Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); }); 
          } 
            
       }  
        
       private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e) { 
          try { 
             string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace; 
             errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");  
             System.Windows.Browser.HtmlPage.Window.Eval("throw new Error
                (\"Unhandled Error in Silverlight Application " + errorMsg + "\");"); 
          } catch (Exception) {} 
       } 
    } 
    

    注意事项

    请注意,您不能更改RootVisual 。您只需要设置一次。如果要在应用程序运行时更改用户界面,则必须通过更改MainPage的内容来做到这一点,而不是尝试用其他页面替换MainPage

    其他应用程序事件是Exit(退出) ,这是您最后一刻在用户界面即将消失时运行关闭代码的机会; UnhandledException (如果您的代码引发未处理的异常,则会引发此异常)。

    如果不为UnhandledException事件提供处理程序,或者该处理程序未将事件标记为已处理,则UnhandledExceptions将有效地关闭Silverlight应用程序。

    屏幕上的插件区域将变为空白,并且脚本错误将报告给浏览器。