Silverlight - การรวมเบราว์เซอร์

ในบทนี้เราจะมาดูกันว่าแอปพลิเคชัน Silverlight สามารถทำงานร่วมกับเว็บเพจโดยใช้การสนับสนุนการรวมเบราว์เซอร์ได้อย่างไร

เราสามารถสำรวจการรวม Silverlight กับเบราว์เซอร์ได้สองวิธีต่อไปนี้ -

  • โค้ด JavaScript ที่ทำงานในเบราว์เซอร์สามารถเข้าถึงคุณสมบัติภายในแอปพลิเคชัน Silverlight ของคุณ

  • Silverlight มีความสามารถในการจัดเตรียม JavaScript wrapper สำหรับออบเจ็กต์ ของคุณ.NET โค้ดที่ทำงานภายในปลั๊กอิน Silverlight สามารถเข้าถึง HTML DOM และคุณลักษณะการเขียนสคริปต์ของเบราว์เซอร์อื่น ๆ เนื่องจาก Silverlight .NET Wrapper สำหรับวัตถุ JavaScript

เราจะดูว่าแอปพลิเคชันซอฟต์แวร์ที่ใช้เบราว์เซอร์สามารถจัดเก็บข้อมูลบนไคลเอนต์ได้อย่างไร

Silverlight และ HTML

เท่าที่เกี่ยวข้องกับโลกของ HTML เนื้อหา Silverlight เป็นเพียงองค์ประกอบเดียว นี่เป็นจริงสำหรับการจัดวาง ปลั๊กอิน Silverlight ทั้งหมดและเนื้อหาทั้งหมดดูเหมือนเป็นเพียงองค์ประกอบออบเจ็กต์เดียว

คุณต้องจำไว้ว่า -

  • Silverlight ไม่ได้มาแทนที่ HTML แต่ได้รับการออกแบบมาเพื่อเสริม ดังนั้นความสามารถในการเข้าถึงเพียงองค์ประกอบอื่นใน DOM จึงมีความสำคัญ

  • ช่วยให้คุณใช้ Silverlight ได้ตามความเหมาะสม

  • ในหน้าเว็บที่ใช้ HTML เป็นหลักการผสานรวม Silverlight กับโลกของเบราว์เซอร์นั้นเป็นมากกว่าเพียงองค์ประกอบ DOM ที่มีอยู่ภายใต้เค้าโครง HTML ปกติ

การเข้าถึง DOM

เนื้อหา Silverlight ต้องสามารถเข้าร่วมได้อย่างสมบูรณ์ในหน้าเว็บ ดังนั้นจึงควรเข้าถึง HTML DOM Silverlight จัดเตรียมอ็อบเจ็กต์บริดจ์ที่ห่ออ็อบเจ็กต์สคริปต์ของเบราว์เซอร์เป็นอ็อบเจ็กต์ Dot Net ซึ่งเป็นไฟล์Script objectคลาสในระบบ เนมสเปซของเบราว์เซอร์มีวิธีการที่ช่วยให้คุณอ่านและเขียนคุณสมบัติและอุทิศฟังก์ชันบนวัตถุสคริปต์ของเบราว์เซอร์

คุณต้องการวิธีที่จะได้รับวัตถุสคริปต์ในตอนแรก Silverlight จัดเตรียมคลาสเพจ HTML ที่ให้คุณเข้าถึงเพจต่างๆของคุณสมบัติเช่นอ็อบเจกต์สคริปต์

ให้เราดูตัวอย่างง่ายๆที่เรามีสคริปต์ง่ายๆที่สร้างวัตถุที่มีคุณลักษณะบางอย่าง บางส่วนเป็นเพียงค่านิยมและสองสามอย่างเป็นฟังก์ชัน

<script type = "text/javascript">  
   myJsObject = { 
      answer: 42, 
      message: "Hello, world", 
      modifyHeading: function(title) 
         { document.getElementById('heading').innerHTML = title; }, 
      performReallyComplexCalculation: function(x, y) { return x + y; } 
   }; 
     
</script>

ด้านล่างนี้คือรหัส XAML ที่มีการเพิ่มปุ่ม

<UserControl x:Class = "DomAccess.Page" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"  
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"  
   Width = "400" Height = "300"> 
   
   <Grid x:Name = "LayoutRoot" Background = "White"> 
      <Button x:Name = "useDomButton" Content = "Use DOM" Width = "75" Height = "30" 
         Click = "useDomButton_Click" /> 
   </Grid>
	
</UserControl>

นี่คือการใช้งานการคลิกปุ่มซึ่งสคริปต์เรียกว่าซึ่งสร้างขึ้นในไฟล์ HTML

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Net; 

using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes;
using System.Windows.Browser; 

using System.Diagnostics; 
 
namespace DomAccess { 

   public partial class Page : UserControl { 
	
      public Page() { 
         InitializeComponent(); 
      } 
   
      private void useDomButton_Click(object sender, RoutedEventArgs e) { 
         ScriptObject myJsObject = HtmlPage.Window.GetProperty("myJsObject") as ScriptObject;  
         string[] propertyNames = { "answer", "message", "modifyHeading", 
            "performReallyComplexCalculation" }; 
				
         foreach (string propertyName in propertyNames) { 
            object value = myJsObject.GetProperty(propertyName); 
            Debug.WriteLine("{0}: {1} ({2})", propertyName, value, value.GetType()); 
         }
			
         object result = myJsObject.Invoke("performReallyComplexCalculation", 11, 31);  
         HtmlElement h1 = HtmlPage.Document.GetElementById("heading"); 
         h1.SetProperty("innerHTML", "Text from C# (without JavaScript's help)"); 
         h1.SetStyleAttribute("height", "200px"); 
      } 
   } 
}

ด้านล่างเป็นไฟล์ HTML ที่สมบูรณ์

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "
   http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	
<html xmlns = "http://www.w3.org/1999/xhtml" > 
   <!-- saved from url = (0014)about:internet --> 
	
   <head> 
      <title>DomAccess</title>  
		
      <script type = "text/javascript">  
		
         myJsObject = { 
            answer: 42, 
            message: "Hello, world", 
            modifyHeading: function(title) { 
               document.getElementById('heading').innerHTML = title; }, 
            performReallyComplexCalculation: function(x, y) { return x + y; } 
         }; 
     
      </script> 
     
      <style type = "text/css"> 
		
         html, body { 
            height: 100%; 
            overflow: auto; 
         } 
			
         body { 
            padding: 0; 
            margin: 0; 
         } 
			
         #silverlightControlHost { 
            height: 100%; 
         }
			
      </style>
		
      <script type = "text/javascript" src = "Silverlight.js"></script> 
		
      <script type = "text/javascript"> 
		
         function onSilverlightError(sender, args) { 
            var appSource = ""; 
				
            if (sender != null && sender != 0) { 
               appSource = sender.getHost().Source; 
            }  
				
            var errorType = args.ErrorType; 
            var iErrorCode = args.ErrorCode; 
             
            var errMsg = "Unhandled Error in Silverlight 2 Application " +  
               appSource + "\n" ; 
					
            errMsg += "Code: "+ iErrorCode + "    \n"; 
            errMsg += "Category: " + errorType + "       \n"; 
            errMsg += "Message: " + args.ErrorMessage + "     \n";
				
            if (errorType == "ParserError") { 
               errMsg += "File: " + args.xamlFile + "     \n"; 
               errMsg += "Line: " + args.lineNumber + "     \n"; 
               errMsg += "Position: " + args.charPosition + "     \n"; 
            } else if (errorType == "RuntimeError") {  
				
               if (args.lineNumber != 0) { 
                  errMsg += "Line: " + args.lineNumber + "     \n"; 
                  errMsg += "Position: " +  args.charPosition + "     \n"; 
               } 
					
               errMsg += "MethodName: " + args.methodName + "     \n"; 
            }
				
            throw new Error(errMsg); 
         }
		  
      </script> 
		
   </head>  
	
   <body> 
	
      <!-- Runtime errors from Silverlight will be displayed here. 
         This will contain debugging information and should be removed or hidden when 
         debugging is completed -->
			
      <div id = 'errorLocation' style = "font-size: small;color: Gray;"></div> 
		
      <h1 id = 'heading'></h1>
		
      <div id = "silverlightControlHost"> 
		
         <object data = "data:application/x-silverlight-2," 
            type = "application/x-silverlight-2" width = "100%" height = "100%"> 
				
            <param name = "source" value = "ClientBin/DomAccess.xap"/> 
            <param name = "onerror" value = "onSilverlightError" /> 
            <param name = "background" value = "white" /> 
            <param name = "minRuntimeVersion" value = "2.0.30923.0" /> 
            <param name = "autoUpgrade" value = "true" /> 
				
            <a href = "http://go.microsoft.com/fwlink/?LinkID=124807" 
               style = "text-decoration: none;"> 
               <img src = "http://go.microsoft.com/fwlink/?LinkId=108181" 
               alt = "Get Microsoft Silverlight" style = "border-style: none"/> 
            </a> 
				
         </object>
			
         <iframe style = 'visibility:hidden;height:0;width:0;border:0px'></iframe> 
			
      </div> 
		
   </body> 
	
</html>

เมื่อโค้ดด้านบนถูกคอมไพล์และดำเนินการคุณจะเห็นค่าทั้งหมดในหน้าต่างเอาต์พุตซึ่งดึงมาจากไฟล์ HTML