首頁

2013年9月7日 星期六

*網友遇疑問*安裝了64BIT windows 7 有十分多問題! >>sliverlight 安裝不了, pdf 又不能開啟!!**哪么~請嘗試在Windows 7--Silverlight中嵌入HTML、Flash和PDF檔或編成Silverlight 的導航框架與動態載入的解決方法!!吧~*[*請網友回報可行否?!*本人無法親測*]謝謝~

***網友遇疑問*安裝了64BIT windows 7 有十分多問題! >>sliverlight 安裝不了, pdf 又不能開啟!!*
*哪么~請嘗試在Windows 7--Silverlight中嵌入HTML、Flash和PDF檔或編成Silverlight 的導航框架與動態載入
的解決方法!!吧~
*[ 本人無法親測該程式之效用~!故請網友告知可行否 ]謝謝~

**1).HTMLHOST**
網站   
HTTP://www.divelements.co.uk/silverlight/tools.aspx 
下載:HTTP://www.divelements.co.uk/silverlight/SilverlightTools.1.0.1.zip
Free Silverlight Controls
接著,就對該元件進行介紹並且通過實際範例講述該元件的應用 .
1、基本特性
元件所在命名空間:
Divelements.SilverlightTools
元件常用屬性:
SourceUri:顯示在該元件中的內容的URI。
SourceHtml:用該元件顯示的超文字內容。
Document:顯示在該元件中的內容的HTML .
元件常用事件:
DocumentReady:當在該元件中的內容的HTML載入完畢後觸發該事件 .
2、實例講解
注意:該元件需在windowless模式下才能正常運行。
因此,首先要對服務端資料夾下的SilverlightClientTestPage.aspx檔或SilverlightClientTestPage.html檔做如下修改:

<form id="form1" runat="server" style="height:100%">
<div id="silverlightControlHost">
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
<param name="source" value="ClientBin/SilverlightClient.xap"/>
<param name="onError" value="onSilverlightError" />
<param name="background" value="white" />
<param name="minRuntimeVersion" value="3.0.40624.0" />
<param name="autoUpgrade" value="true" />
<param name="windowless" value="true" />
<a href="HTTP://go.microsoft.com/fwlink/?LinkID=149156&v=3.0.40624.0" style="text-decoration:none">
<img src="HTTP://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style:none"/>
</a>
</object><iframe id="_sl_historyFrame" style="visibility:hidden;height:0px;width:0px;border:0px"></iframe></div>
</form>

接著,將需要嵌入的Flash檔及PDF檔放置在服務端資料夾的根目錄下 .
右擊SilverlightClient資料夾下的References,引入Divelements.SilverlightTools命名空間。

按Ctrl+Shift+B編譯 .然後,在SilverlightClient資料夾下新建一個Silverlight UserControl,
將其命名為ControlHtmlHost.xaml。該檔內容如下:

<UserControl x:Class="SilverlightClient.ControlHtmlHost"
xmlns="HTTP://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="HTTP://schemas.microsoft.com/winfx/2006/xaml"
xmlns:divtools="clr-namespace:Divelements.SilverlightTools;assembly=Divelements.SilverlightTools"
Width="900" Height="530">
<Grid x:Name="LayoutRoot" Background="White">
<divtools:HtmlHost Name="htmlHost"/>
</Grid>
</UserControl>

以下是MainPage檔的內容:
MainPage.xaml檔代碼:
<UserControl x:Class="SilverlightClient.MainPage"
xmlns="HTTP://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="HTTP://schemas.microsoft.com/winfx/2006/xaml"
xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:d="HTTP://schemas.microsoft.com/expression/blend/2008" xmlns:mc="HTTP://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480">
<Grid x:Name="LayoutRoot">
<StackPanel>
<!--巡覽列-->
<StackPanel Orientation="Horizontal" Background="WhiteSmoke">
<Button x:Name="myHTML" Content="HTML內容" FontSize="14"/>
<Button x:Name="myFlash" Content="Flash" FontSize="14"/>
<Button x:Name="myPDF" Content="PDF文檔" FontSize="14"/>
</StackPanel>
<Grid x:Name="Container"/>
</StackPanel>
</Grid>
</UserControl>

MainPage.xaml.cs檔代碼:
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 Divelements.SilverlightTools;

namespace SilverlightClient
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
//註冊事件觸發處理
this.Loaded += new RoutedEventHandler(MainPage_Loaded);
this.myHTML.Click += new RoutedEventHandler(myHTML_Click);
this.myFlash.Click += new RoutedEventHandler(myFlash_Click);
this.myPDF.Click += new RoutedEventHandler(myPDF_Click);
}

void MainPage_Loaded(object sender, RoutedEventArgs e)
{
GetRichContent("HTTP://cn.bing.com", UriKind.Absolute);
}

void myPDF_Click(object sender, RoutedEventArgs e)
{
GetRichContent("/test.pdf",UriKind.Relative);
}

void myFlash_Click(object sender, RoutedEventArgs e)
{
GetRichContent("/clock.swf", UriKind.Relative);
}

void myHTML_Click(object sender, RoutedEventArgs e)
{
GetRichContent("HTTP://cn.bing.com", UriKind.Absolute);
}

//獲取Rich Content
void GetRichContent(string uri,UriKind uk)
{
Container.Children.Clear();
ControlHtmlHost chtml = new ControlHtmlHost();
HtmlHost hh = chtml.FindName("htmlHost") as HtmlHost;
hh.SourceUri = new Uri(uri, uk);
Container.Children.Add(chtml);
}
}
}

----------------------------------------------------------------------------------------------------------
2)..
*編出*Silverlight*導航框架**動態載入***Silverlight 3 的導航框架簡介
Silverlight 提供了內置的導航框架,可以比較輕鬆的在 Silverlight Page 之間進行切換,
並且可以和瀏覽器的前進、後退按鈕集成,下面的代碼可以簡單的說明其用法:

這段代碼很簡單,通過設置 HyperLinkButton 的 NavigationUri 和 TargetName 兩個屬性,
可以讓指定的 Frame 去載入指定的 Silverlight Page .

2. 常見的動態載入解決方案
當 Silverlight 專案比較大的時候, 很自然的會想到將 Silverlight 專案拆分成多個 xap 檔,
進行按需載入,這個實現起來也不難。
通常的做法是使用 WebClient 或者 HttpWebRequest ,向服務端請求所需的 xap 檔,
然後通過 xap 壓縮包內的 AppManifest.xaml 檔,
獲取到 xap 檔內部打包的 dll 檔資訊,在用戶端通過反射進行載入。

3. 導航框架與動態載入相結合時遇到的問題,原因與解決方法
如果將這兩者結合起來,利用 Sliverlight 內置的導航框架來載入動態載入的 xap 檔內部的 Silverlight Page ,
對應用程式的開發和使用者體驗都是有很大説明的:
對開發方面來說,不用反射載入,而是使用 Silverlight 內置的導航框架,可以節省很多代碼;
對使用者體驗方面,按需載入能減少初始載入檔的大小,減少等待時間,
使用導航框架可以和瀏覽器的前進、後退按鈕緊密集成,使用者體驗更佳。
但是,在 Silverlight 3 目前的版本中, Frame 控制項似乎不能直接載入動態載入的 Silverlight Page ,
不管是通過設置 HyperLinkButton 的 NavigateUri 屬性,還是通過調用 Frame.Navigate(Uri source) 方法,
都會出現相同的異常, 看下面代碼:

var xap = "http://localhost:2704/AppSL.Web/ClientBin/TestSLApp.xap";// LoadPackage 是載入 xap 的擴充方法
Deployment.Current.LoadPackage(xap, () => {
   var uri = new Uri("/TestSLApp;component/MainPage.xaml", UriKind.Relative);
   this.WidgetFrame.Navigate(uri);
});
當執行至 WidgetFrame.Navigate(uri) 時,會出現下面的異常:
是什麼原因導致這個異常呢? 通過 Reflector 察看 --
--PageResourceContentLoader ,發現載入 x:Class 的是這個 GetTypeFromAnyLoadedAssembly 方法:


**這個方法只是遍歷 Deployment.Current.Part 去尋找所需要的類型,
並沒有去遍歷動態載入的檔, 當然,這裡也不可能去遍歷。
看到這裡,終於找到異常出現的原因了,由於這個方法是私有並且是靜態的,

無法進行重寫,只能通過其它途徑來解決。
我想到的解決方法是,新建一個 Silverlight Page,
然後刪除對應的代碼檔,刪除 xaml 視圖的 x:Code 資訊,如下圖所示:
*****


[b 以上為最後的解決方案就是, 要做一個引導的檔,
這個檔必須是一個獨立的 xaml 檔,沒有代碼檔,沒有 x:Class 資訊,
這樣就不會被編譯成新的類型,自然可以被 Silverlight 的導航框架載入了



不知道 Silverlight 以後的版本會不會考慮動態載入的問題呢? 據我所知, Flex 已經內置了模組動態載入的機制了!!請嘗試在Windows7--Silverlight中嵌入HTMLFlashPDF檔或編成Silverlight 的導航框架與動態載入的解決方法~~完結~~*****THE   END****                                     &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

沒有留言:

張貼留言


if you like make fds, wellcome you here~~anytime***

my free place for everyones who want the good software,

come & download them~ wellcome!!