公告資訊

未經授權,禁止轉載網站文章與內容。如有需要可以跟我聯絡,謝謝!!




2008年8月29日 星期五

Silverlight 2 線上講堂通知(08/29)

接下來的課程,隨著我手上的專案與範例的進行,有些已經寫好了,也有些已經寫的差不多了,下個星期開始會陸續刊載:

Silverlight 2 線上講堂 - 20:使用OpenFileDialog 開啟用戶端檔案

Silverlight 2 線上講堂 - 21:開發檔案上載服務

Silverlight 2 線上講堂 - 22:簡單ListBox資料繫結

Silverlight 2 線上講堂 - 23:ListBox Template與資料繫結

Silverlight 2 線上講堂 - 24:開發記事本工具(操作介面)

Silverlight 2 線上講堂 - 25:開發記事本工具(程式)

Silverlight 2 線上講堂 - 26:Silverlight 2 應用程式開發觀念(3)

Silverlight 2 線上講堂 - 27:效能最佳化 -- 隨選下載組件

Silverlight 2 線上講堂 - 28:與JavaScript共舞(1)

Silverlight 2 線上講堂 - 29:與JavaScript共舞(2)

Silverlight 2 線上講堂 - 30:動態切換介面與定位技巧(1)

Silverlight 2 線上講堂 - 31:動態切換介面與定位技巧(2)

Silverlight 2 線上講堂 - 32:與ASP.NET整合(1)

其他的主題會在適當的時機再擇期公布................

謝謝大家!

2008年8月28日 星期四

在轉與不轉之間......

記得當年DHTML剛出來的時候,跑馬燈、跟著滑鼠跑的彩色文字等效果曾經興盛一時。當年的網頁常常見到五顏六色、動態切換、旋轉的文字及圖片效果,看得讓人頭昏眼花、眼花撩亂......

但是慢慢的,大家就發現了很多的效果其實是不需要的--於是DHTML從絢爛歸於平實,恢復到目前單純的狀態(有多少網頁還要跑馬燈的效果???) -- 與伺服器端的程式整合,隨著操作狀態做適當的反應。

一樣的過程,現在正反應在所謂的"RIA"的技術當中。由於Flash技術稱霸用戶端的動態效果技術已經行之有年了,因此當微軟的Silverlight技術推出之後,很多人很自然的就會拿來和Flash技術做比較。但畢竟微軟是作開發工具起家的,雖然Silverlight提供了許多和Flash一樣的動態效果的支援,無奈提供給設計人員使用的Expression Blend設計工具,目前看來就是稍微遜色一些(我是說"目前",別忘了Flash已經出來多久了......)。

但是相對的,我必須說,Silverlight 2.0 在提供給開發人員用的部分來講,功能就相當方便了!!  若是以開發人員的角度來看,無論是與伺服器端ASP.NET程式結合,或是呼叫用戶端的JavaScript,VS 2008開發工具都可以提供相當充分而且完整的支援 -- 甚至包含除錯的部分,通常這也是開發工具在分散式架構中最難支援的部分。

因此,在Silverlight 2.0 線上講堂中,我們是以開發人員的角度來看待Silverlight。更明確一點的角色分配如下:

  • 設計人員:

負責設計畫面(操作介面),以及設計Storyboard(時間軸)動作。

  • 開發人員:

負責開發與伺服器端服務結合的程式,以及撰寫事件觸發程序觸發Storyboard。

基於這一個出發點,因此當初在設計"Silverlight Desktop"(暫定名稱)時,曾經想過設計一個單純的桌面就好,因為還有很多功能等著完成(包含講堂中的課程內容,又有點拖稿了...)。不過一時手癢,又把文字旋轉的功能加了進去,免得大家覺太單調 -- 不過就像雞肋一樣,拿掉也不會覺得可惜。在此之前,其實有跟很多人討論過關於用戶端操作介面的想法,結論是除非你要設計的是一個遊戲的操作介面,要不然的話,過於豐富的使用者操作介面的內容,使用者不一定會接受(別忘了,用Flash設計的首頁下方,都會放一個"SKIP"按鈕 !!!)。

因此,在透過Silverlight 2.0設計使用者操作介面的動作時,也應該是在"適時"的時候,給予使用者適當的反應即可。依照這一個標準來看,Silverlight Desktop上的文字旋轉功能的確是多餘的,但是在我還沒有做完遊樂場的小遊戲之前,我想還是暫時讓它保持旋轉吧!!

2008年8月27日 星期三

Silverlight 2 線上講堂 - 19:Microsoft Silverlight Streaming Host

如果,你在開發Silverlight 2.0 線上講堂的練習的時候,除了使用Visual Studio 2008 檢視完成的結果之外,也想讓其他的朋友也可以在你的網頁上瀏覽你完成的成果的話,你可以將完成的Silverlight應用程式發布到微軟所提供的Microsoft Silverlight Streaming Host,然後在繫結到你的網頁中使用。操作步驟如下:

1. 開啟http://www.microsoft.com/silverlight/overview/streaming.aspx,然後點選[Get it free]按鈕。

快照1

2. 若是你有MSN live 帳號(Microsoft Passport)的話,這時候應該就會自動登入,並且建立關聯。接下來選取左邊選單中的[Manage Applications]選項:

快照2

然後選取[Upload an application] 按鈕。

快照3

3. 輸入一個128字元以內的應用程式名稱之後,然後按下[Create]按鈕:

快照5

4. 接下來,按下[瀏覽]按鈕,選取封裝Silverlight 2.0應用程式的XAP檔(必須小於105MB),然後按下[Upload]按鈕:

快照6

5. 接下來進行應用程式的設定。先按下[Create]按鈕:

快照7

接著,從組態設定表單中,設定將來Silverlight 2.0應用程式顯示的外觀,完成之後按下[Update]按鈕:

快照8

6. 接下來,就可以在網頁上看到開啟測試網頁的路徑:

快照9

以及在網頁下方也會出現嵌入網頁的連結:

快照10

7. 接下來,只需要將連結加入你的網頁或是Blog的設定當中,就可以嵌入Silverlight應用程式到網頁中了!

除了直接嵌入的方式之外,Silverlight Streaming Host也提供可以使用Live Control的方式將Silverlight應用程式嵌入網頁中使用,只需參考網頁中Method 2的設定步驟即可:

快照11

像是前面做過的圖片跑馬燈、圖片輪播器、網頁banner等以用戶端瀏覽器為主要執行環境的Silverlight應用程式,都可以使用這個方式上載到Silverlight Streaming Host之後嵌入到網頁中使用。

另外,這一個網站也提供每位使用者10GB的空間可以放影片的資料,上載的步驟如下:

1. 選取左邊的[Manage Videos]連結,然後按下[Upload a video]。

快照12

2. 然後確定你所要上載的是Silverlight技術所支援的影片格式(以WMV為主),選取核選方塊之後按下[Browse]按鈕選取影片路徑。輸入影片標題之後,按下[Upload]按鈕:

快照15

3. 接下來你會看到[Copy File]的視窗出現:

快照16

4. 經過一段時間的等待....影片上載完成之後,就可以透過Silverlight應用程式中的MediaElement來播放了!! 在影片的說明頁中,會提供直接將影片嵌入網頁中顯示,以及使用MediaElement控制項播放時所需要的連結資訊:

快照17

2008年8月26日 星期二

小寶的評語......

昨天利用一點時間,把Silverlight 2.0範例網站的首頁(http://www.silverlight.idv.tw)簡單的做了一下,因為真的是太多人看到IIS 7.0的首頁以為進到偽裝站台(我也不知為啥.....)。第一版大功告成之後,請我們家小寶來看了一下。Demo 完畢之後,她只淡淡的說了一句.......

"你們這些搞電腦的,美術都要再加強一下!"

"東西動來動去,看得我頭好暈......"

Orz

2008年8月25日 星期一

問題與回應(08/25)

經過了非常、非常忙的幾個星期之後,整理一下大家的問題回覆一下:

1.

首先感謝Rojar細心的又找出了一些Visual C# 2008精研講座書中的錯誤:

P.426. 表13-8的GetFileWithoutExtension的說明,應更正為"不包含檔名"。

(原錯字為"附")

P.441  第三行:"才可註冊公域組件" ==> 應更正為"才可註冊到全域組件中公用"。

   倒數第三行:"系統功能都定義在.NET平台中"

                ==> 應更正為:"系統功能都定義在.NET平台中"

P.515 "註冊到部資料交換服務中" ==> "加入部資料交換服務"

AddService 我想以後就稱為加入服務吧,雖然有時上課我會說成"註冊"。

P.520 操作步驟4,應為「加入」-->「欄位」。

P.522 操作步驟4,介面名稱應更正為 IHelloService (書中誤植為IHelloServive)。

P.537 操作步驟23,應更正為"右邊的條件分支"。

P.550 Employee屬性名稱應為EmpName;順便提醒要記得引用System.Runtime.Serialization命名空間!

P.618 執行範例程式前,請檢查一下connString連線字串的設定,與你的開發環境是否一致。

Rojar,如果你將來失業,我可以推薦你去做技術編輯了......

(但是V大人,我還是不能沒有你.......Orz)

2.

老師,請問一下為什麼我進到www.silverlight.idv.tw,看到的是IIS 7的首頁呢?

老師我覺得你的說明與例子都比之前聽過的那些研討會清楚的很多,請問一下你最近會開課或是講Silverlight的研討會嗎?

==>

www.Silverlight.idv.tw 的網站目前是用來放線上講堂的範例的網站,因為我最近很忙,所以暫時用IIS 7的預設頁面當做是首頁。另外,在這網站上,我有一個關於Silverlight 2.0的計畫正在開發當中,目前還不到公布的時機(不過也快了.....),等時機成熟各位就會知道了。暫時我會先做一個簡單的首頁把範例連結放上去,這樣看起來可能會好一些.....

至於開課的話,因為目前Silverlight 2.0才到Beta 2,因此暫時還是先以線上講堂的形式幫助大家了解這一個新技術。Silverlight 2.0線上講堂的內容主要是針對開發人員做規劃的,因此和你去聽以介紹動畫效果的為主要內容的研討會,應該方向會不太一樣,所以你才會有這樣的感覺。如果你是想開發出像廣告banner般動畫效果的設計人員,你把Silverlight 2 講堂前幾堂課的基本操作學會,再去聽聽研討會或是WebCast應該就夠了;但若是你是要結合Silverlight 2.0技術開發分散式架構應用程式的話,那我建議你可以跟著線上講堂的進度操作練習,等到Silverlight 2.0正式推出之後,你可以馬上上手了。

至於研討會的部分,我想因為我的行程很滿,所以可能就要跟上次說的一樣,需要透過LiveMeeting的方式,在晚上有空的時間再來跟各位交流。第一次會在九月初舉辦,確定的時間會公布在Silverlight 2.0網站和blog的公告區,敬請期待......

3.

請問老師ASP.NET、AJAX、跟Silverlight有沒有推薦的中文書?

==>

除了上課需要的指定教材之外,我是幾乎沒在看中文書的。因此每次學員問我這樣的問題,我的答案一定是:"你去書局每本都翻翻看,覺得買回去之後會看到最後一頁的才買。"。如果真的沒有辦法抉擇的話,你可以考慮恆逸的老師出的書。我不敢說書裡不會有錯字(編輯大人會盡力幫忙),但是至少不會有錯誤的觀念,而且也不會有一堆火星文在書中。

如果可能的話,我會建議你先聽過課之後再去找書來參考,這樣你才會更清楚你需要的是哪方面的書。

2008年8月23日 星期六

Silverlight 2 線上講堂通知(08/23)

接下來要開始介紹如何開發網路磁碟機,以及製作網路版的記事本。
各位有興趣的話可以先試一下網路磁碟機的範例:


          網路磁碟機 - (1)

2008年8月22日 星期五

關於在WPF當中使用Windows控制項的做法

首先,要先了解的是,WPF與Windows表單是不同的架構,所以在WPF表單中使用Windows控制項的時候,有些效果會無法控制,像是可見的 WindowsFormsHost 項目一定是在其他 WPF 項目的上層,而且不會受到疊置順序影響、不支援旋轉等等。

若是你一定需要在WPF表單中嵌入Windows控制項,甚至是動態建立Windows控制項操作的話,請參考下面步驟:

1. 在WPF專案中,透過[加入參考]方式,參考WindowsFormsIntegration.dll、System.Windows.Forms.dll 兩個組件。

2. 在XAML的<Window>標籤中,加入下面的命名空間宣告:

xmlns:wf
= "clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

3. 在WPF表單要顯示Windows控制項的位置,加入WindowsFormsHost控制項,然後就可以加入Windows控制項:

<WindowsFormsHost Margin="12,52,66,110" Name="windowsFormsHos2">
    <wf:Button Text="Click!!"   BackColor="Pink" FlatStyle="Flat"/>
</WindowsFormsHost>

4. 若是希望可以透過程式進行動態配置控制項動作的話,就必須在WindowsFormsHost控制項中加入FlowLayoutPanel或是TableLayoutPanel,參考下面的XAML樣式:

<WindowsFormsHost Margin="12,52,66,110" Name="windowsFormsHost1">
     <wf:FlowLayoutPanel/>
</WindowsFormsHost>

   接下來,就可以在程式中,動態加入Windows控制項了!!

private void button1_Click(object sender, RoutedEventArgs e)
{
    System.Windows.Forms.FlowLayoutPanel flp =
       this.windowsFormsHost1.Child as System.Windows.Forms.FlowLayoutPanel;
    System.Windows.Forms.Button btn = new System.Windows.Forms.Button();
    btn.Text = "Hello!";
    flp.Controls.Add(btn);
}

2008年8月20日 星期三

Silverlight 2 講堂 - 18:透過WCF與Server端程式整合(動作效果)

我在 "微軟新一代分散式架構與網際網路開發技術剖析(3)" 文章中,說明了Silverlight 2.0應用程式在新一代應用程式架構中所扮演的角色,特別是以做為展示層技術而言,Silverlight 2.0 應用程式比AJAX多了很多的好處:

1. 不需要學JavaScript。

2. 提供了BCL,使用 .NET程式開發經驗就可以建立前端(瀏覽器)動態效果。

3. CLR提供了自動記憶體管理與有效率的程式執行環境 (理論上,Beta2 還不錯)。

4. 提供了WCF以及Sydication等方式與雲端運算環境溝通。

5. 支援LINQ與XML資料繫結技術。

但是你要注意的是:Silverlight 2.0是執行在瀏覽器中的應用程式! 因此你所開發的程式,主要是用來處理展示層中的運算邏輯的! 換句話說,Silverlight 2.0就程式開發的角度來看的話,與ASP.NET AJAX扮演的角色較為相近。與ASP.NET AJAX技術相比較,Silverlight 2.0應用程式的好處,主要就是前面所列的幾點;但是Silverlight 2.0應用程式與ASP.NET伺服器端執行環境整合性沒有ASP.NET AJAX方便,則是他的弱點。

上篇文章提到了Silverlight 2.0典型的應用程式開發模型如下圖:

Silverlight2-rt 

這一堂課就讓我們利用上次的WCFHelloWorld專案,來討論實作一下這一個模型。

1. 先使用VS 2008開啟上次的WCFHelloWorld解決方案,開啟WCFHelloWorldWeb網站專案的App_Code目錄下的MyService.cs原始檔。

    分散式架構開始實作之前必須要先定義溝通的規格。在MyService.cs原始檔當中的[ServiceContract]與[OperationContract]就是用來宣告規格定義的。關於WCF的一些基礎操作各位可以先看我的"Visual C# 2008 精研講座"書中的介紹。

2. 在DoWork方法中,我們加入一行程式碼,將WCF服務的運算時間延長到8秒:

[OperationContract]
public string DoWork(string username)
{
    // Add your operation implementation here
      System.Threading.Thread.Sleep(8000);
      return "Hello, " + username +
          ". Time is " + DateTime.Now.ToLongTimeString();
}

      分散式架構中,你無法估算遠端元件需要花多少時間運算。因此在這次的練習中,我們就模擬呼叫一個需要長時間執行的服務(但非批次性工作,注意!!);然後在呼叫服務的過程當中,我們就可以加入一些動態的效果。

3. 使用Expression Blend 2.5開啟WCFHelloWorld專案,然後開啟Page.xaml。

4. 選取txtAnswer(下面的)TextBox控制項,然後到[Properties] -->[Misecellaneous]視窗中,選取IsReadOnly:

LOGO

4. 在txtAnswer下方,加入一個長度約略和txtAnswer相等,高度較txtAnswer高的Canvas控制項。然後再從工具箱中選取一個TextBlock控制項,加入Canvas控制項當中:

快照2

5. 在TextBlock控制項中,輸入等待服務回應時,所要顯示的文字。參考完成結果如下圖:

快照3

6. 選取TextBlock控制項,然後到[Properties]視窗中,將其名稱設為tbMessage;然後在[Brushes]視窗中,設定Foreground(前景色)為白色(不用太精確,沒有關係):

快照4

    然後TextBlock當中的文字就會以白色顯示如下:

快照5

7. 新增一個Storyboard,取名為ShowWaitMessage。

第0秒的時候,將TextBlock控制項的Left屬性設為0。

第1.5秒的時候,將TextBlock控制項的右邊文字尾端對齊Canvas控制項的右邊界。

第3秒的時候,將TextBlock控制項的Left屬性設為0。

完成之後停止錄製時間軸。

8.  接著在[Appearance]視窗中,將Visibility屬性值設為Collapsed。

快照6

接著存檔之後Build專案,然後關閉Expression Blend設計工具。

(設計人員工作完成)

9. 使用VS 2008開發工具開啟WCFHelloWorld專案中的Page.xaml.cs程式檔。

10. 在Button_Click事件處裡常式中,加入顯示TextBlock控制項,並啟動ShowWaitMessage時間軸的程式:

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyServiceReference.MyServiceClient proxy
        = new WCFHelloWorld.MyServiceReference.MyServiceClient();


    proxy.DoWorkCompleted += new EventHandler<WCFHelloWorld.MyServiceReference.DoWorkCompletedEventArgs>(proxy_DoWorkCompleted);

    proxy.DoWorkAsync(txtName.Text);

    tbMessage.Visibility = Visibility.Visible;
    ShowWaitMessage.RepeatBehavior = RepeatBehavior.Forever;
    ShowWaitMessage.Begin();

}

將RepeatBehavior屬性值設為Forever之後,動畫效果就會一直重複執行。

11. 在proxy_DoWorkCompleted事件處理常式當中,當存取服務動作完成時,呼叫Stop方法停止時間軸,並隱藏tbMessage控制項:

void proxy_DoWorkCompleted(object sender, WCFHelloWorld.MyServiceReference.DoWorkCompletedEventArgs e)
{
    Dispatcher.BeginInvoke(delegate()
    {
        ShowWaitMessage.Stop();
        tbMessage.Visibility = Visibility.Collapsed;
        txtAnswer.Text = e.Result;
    });
}

12. 完成之後建置WCFHelloWorld專案,然後執行測試網頁,你會發現當呼叫遠端服務時,文字輸入方塊下方就會出現動態的文字效果了!!

所以說,如果開發人員要學好使用Silverlight 2.0技術開發應用程式的話,就要先有正確的觀念,千萬不要被一些不正確的資訊誘導,以為Silverlight 2.0的重點是在啥圖片或是動畫效果。17、18算是開始與伺服器端邏輯結合的入門範例,接下來我將再帶各位操作更進階的範例,讓你知道怎樣寫好Silverlight 2.0應用程式 -- 而不光只是會放大縮小圖片而已......

2008年8月18日 星期一

微軟新一代分散式架構與網際網路開發技術剖析(3)

介紹完了ASP.NET的架構之後,接下來來談一下Silverlight 2.0的技術。很多人以為,Silverlight 2.0技術的出現,是為了和Flash抗衡,爭奪RIA技術的王座。但從 "Silverlight 2 講堂 -15:Silverlight 外傳(WPF篇)" 這一篇文章中你不難瞭解到,其實Silverlight技術的真正目標,是希望一統網際網路應用程式在用戶端中的開發環境,讓 .NET開發人員在不需要花太多時間學新東西的前題之下,就可以開發與維護套用到各種不同環境的使用者操作介面 -- 當然,也要一舉擺脫在用戶端環境中,JavaScript對於開發人員(或是微軟 ?)所帶來的陰霾。

同時,Silverlight 2.0應用程式也是微軟網際網路開發技術當中,實現MVC設計模式很重要一個展示層技術。如果你對Silverlight 2.0應用程式的開發觀念還不太清楚,請先參考:

透過Silverlight 2.0執行環境支援BCL與CLR,以及可以直接使用C#或是VB開發程式邏輯的特性,讓你很容易就可以將企業級分散式架構的控制元件,在發佈成網路服務(Web Services)或是WCF服務之後,就直接整合到瀏覽器中的Silverlight應用程式當中使用。參考的架構圖如下:

Silverlight2-mvc

企業級MVC-2

當然,這些在雲端中的服務,也可以提供給一般的 .NET 應用程式使用。如此一來,對於企業級分散式架構而言,也就很容易就可以實現軟體服務化(SaaS)的架構。

在 .NET Framework 3.5 平台中,你可以採用下面的方式設計企業級分散式應用程式:

1. 定義在各服務層級之間溝通的功能與訊息規格(Contracts)。

2. 透過SQL Server Data Service、ASP.NET Data Service等技術開發元件模組(Model)。

3. 透過WF(Windows Workflow Foundation)技術,設計工作流程,再發佈成控制元件(Controller)。

4. 透過Silverlight、WPF、Windows Form等技術,建立展示層操作介面(View)。

5. 在各層級之間,可以透過WCF(Windows Communication Foundation)技術,根據事先設計的規格繫結。

而在Silverlight 2.0所建立的展示層當中,更可以結合動畫效果,增加程式在執行時期與使用者之間的互動性。一個典型的Silverlight 2.0應用程式執行的架構如下圖:

Silverlight2-rt

1. 當使用者觸發操作介面畫面元素(element)的事件時,透過事件處裡常式呼叫WCF服務的代理元件。

2. WCF服務的代理元件在用戶端瀏覽器的Silverlight執行環境中,透過非同步方式存取在雲端中的服務。

3. 呼叫遠端服務的同時,也可以啟動事先設計好的Storyboard動作流程,產生動化效果。

4. 當代理元件接收完成遠端服務的執行結果之後,將資料更新到使用者操作介面的元素中,此時也可以搭配Storyboard動作流程產生動態效果。

在 "Silverlight 2 講堂 - 17:透過WCF與Server端程式整合" 文章中,已經介紹了Silverlight 2.0應用程式存取Server端服務的關鍵;後續的講堂課程當中,將會更深入的介紹Silverlight 2.0應用程式的開發。跟上我們的進度,你就會知道其實Silverlight 2.0的設計目標不是只有跑跑動畫而已。還是一句老話:"內行的看門道,外行的看熱鬧"............

2008年8月17日 星期日

微軟新一代分散式架構與網際網路開發技術剖析(2)

在前面我們說明了一些關於ASP.NET的基礎架構,也談到了ASP.NET先天上的一些限制,接下來,讓我們從分散式架構的角度來談一下這些網際網路的開發技術。

講到網際網路的分散式架構,就不可以不談到MVC設計模式。我們在教SCWCD(Sun Certified Web Component Developer)認證課程時,都一定會介紹如何透過MVC架構設計並建立網際網路應用程式;但是在教ASP.NET的課程時,一方面是ASP.NET提供了很豐富的伺服器控制項要學,另一方面前面也提到了因為ASP.NET架構上先天的一些限制,所以要完全實作MVC設計模型也不容易。也可以能是因為這樣,所以大部分ASP.NET的開發人員都不熟悉MVC設計模式。如果你沒有這一方面的概念的話,你可以先參考下面的一些資訊:

若是要了解MVC架構的話,下面這張圖可以說明的相當清楚:

mvc-structure-generic

(圖片資料來源:http://java.sun.com/blueprints/patterns/MVC-detailed.html)

從這張圖你可以很清楚的看出來,ASP.NET的伺服器控制項實際上扮演的是是View與Controller的角色,因此很多開發人員就以為將資料存取與一些Domain的邏輯獨立出來,就算是完成MVC設計模式了。事實上,在JSP當中對於MVC設計模式還分為Model 1與Model 2兩種模型來探討,所謂的Model 1模型就是由JSP同時扮演View與Controller的角色-- ASP.NET預設實作的也是Model 1的模型,因此前面的做法若要說是MVC架構的話,也不能算錯。ASP.NET實作MVC Model 1的架構如下:

ASP.NET Model 1

但Model 1模型通常用在一般的網站或是比較小型的專案,若是要講企業級分散式架構的話,就需要套用到Mode 2的模型。但是因為在ASP.NET預設的架構當中,所有顯示層的改變都需要回伺服器端透過Page與伺服器控制項來處理,造成View與Controller無法分離,因此無法實作出MVC Model 2的模型。

一般來說,目前講MVC設計模式,大多指的也是Model 2的模型。在企業級的應用程式當中,我們必須要同時兼顧到延展性、維護性與效能等等的需求;而在軟體服務化(Software as a Service,SaaS)的趨勢當中,唯有Mode 2的模型,才可以真正的幫助企業建立以服務為導向(Service-Oriented Architecture)的架構。因此我在三月份的網誌 "ASP.NET 3.5的Web API範例" 以及五月份的研討會 "建立以工作流程與訊息為導向的企業級應用程式架構" 當中,就曾經說明過這樣的設計架構。因此採用MVC設計模式,搭配WCF(Web Service)技術,我們就可以讓企業級的應用程式的使用者,透過各種不同類型的方式來存取應用程式--當然,我們只須要建立新的展示層服務就可以了,參考下圖:

 企業級MVC

而為了讓ASP.NET可以支援Model 2的MVC設計架構,因此在ASP.NET 3.5當中,內建了ASP.NET AJAX技術。透過在用戶端瀏覽器中所擴充的Microsoft AJAX Library,不僅可以非同步執行方式更新網頁,更可以直接從用戶端瀏覽器中,直接存取伺服器端的Web Service或是Page Method(其實也是一種Web Service)。因此當你將控制元件(Controller,不要說啥"控件"了) 發佈為Web Service之後,就可以同時提供給ASP.NET AJAX表單,以及其他前端的展示層技術來使用。

***   注意一下,這裡談的ASP.NET AJAX指的是微軟官方所提供的ASP.NET AJAX架構,而非ACT (Ajax Control Toolkit)。其實在ASP.NET 3.5 技術當中,你只要學會將伺服器控制項放到UpdatePanel中使用,就已經相當夠用了。至於ACT,再怎樣強也強不過Silverlight 2.0。

當然,因為ASP.NET AJAX是屬於用戶端瀏覽器中的開發技術,所以也可以支援透過JavaScript來產生動態的效果。ASP.NET AJAX提供了兩種主要的開發模型:

  • 整合伺服器控制項(改善使用者操作經驗)

AJAX1

記得我曾說過:"ASP.NET + AJAX到ASP.NET 4.0還是無敵" 的話吧! 沒錯! 因為就目前開發一般的網際網路應用程式而言,ASP.NET提供了許多支援資料繫結的伺服器控制項(GridView、ListView....等等),加上LINQ、Entity Framework等技術的支援,以及ASP.NET自己本身內鍵的一些服務,整合了ASP.NET AJAX技術之後,要開發出所謂RIA效果的資料存取表單,簡直是易如反掌,打遍天下無敵手啊!! (你可以參考 ASP.NET 3.5 GridView 範例)

 

  • 直接存取網路服務 (做為MVC前端技術)

AJAX2 

透過這一個模型,就可以在ASP.NET當中實現MVC架構!! 然而,Ajax Client Library在瀏覽器中必須要透過JavaScript來開發程式。但若是又回到以JavaScript為主的開發技術的話,微軟勢必沒有辦法主導其技術規格,同時競爭者也多;再者,對於開發人員而言,又要回到ASP時代,為了開發及維護伺服器端與用戶端瀏覽器中的不同技術所開發的程式,而萬分痛苦的年代........

於是乎,微軟有了一統用戶端瀏覽器中執行環境的念頭。關於這一段就請大家參閱:

Silverlight 2 講堂 -15:Silverlight 外傳(WPF篇)

(未完待續..........)

微軟新一代分散式架構與網際網路開發技術剖析(1)

自從.NET 3.0加入了WF、WCF、WPF,ASP.NET推出了ASP.NET AJAX等技術之後,就不斷的有同學問我:"老師,請問一下,我現在到底該學甚麼? ","老師,請問一下,我可以將這些技術應用在哪些地方?" 等這一類的問題,我想你應該可以從這一篇文章中找到答案。

ASP.NET技術推出之後,挾其內建的容易使用、而且可以輕易整合伺服器端資源的伺服器控制項以及Page物件模型,對於網際網路應用程式的發展,不啻跨入了一個新的世代。雖然直譯加編譯式的動態伺服器網頁開發技術早在JSP當中就已經實現了,但是ASP.NET透過伺服器控制項簡化動態網頁開發的架構,間接也帶動了JSP後來衍生出JSF的技術架構(或許Java社群終究還是會實作出來,who knows ?),促使網際網路應用程式開發技術邁入一個新紀元。

但是不管網際網路開發技術如何發展,動態網頁的基礎架構仍然是分為用戶端瀏覽器與伺服器端兩個執行環境,因此不管動態伺服器網頁開發技術(ASP、ASP.NET、JSP、PHP....等)如何演進,都必須要搭配用戶端瀏覽器中執行的程式,才能完成完整的功能。當然,在用戶端瀏覽器中執行程式的首選,就是幾乎所有瀏覽器都有支援的JavaScript。然而對於微軟而言,我想這會是他們不願意樂見的,因為畢竟JavaScript的發展不是他們所能掌控的,因此微軟將以VB語法為基礎的VBScript執行引擎與ActiveX技術嵌入IE中,試著吸引眾多VB的開發人員改用VBScript開發用戶端瀏覽器中執行的程式。

但是畢竟網際網路是一個開放式的平台,不是只有微軟平台的開發人員,加上微軟似乎高估了其他開發人員對於VBScript的支持度,因此JavaScript慢慢的成為用戶端瀏覽器中開發程式的標準,而VBScript則回歸到微軟平台中系統管理人員建立管理指令集的好用工具。這期間,微軟仍不放棄掌控用戶端開發執行環境的念頭,因此和昇陽為了沒有按照標準規格建立的JVM(Java Virtual Machine)而打了場官司 -- 依舊是敗下陣來。

但你別以為微軟因此就放棄了掌控用戶端開發執行環境的想法,事實上,在IE當中雖然你是宣告"text/javascript",不過在IE當中還是採用微軟實作的JScript引擎去執行的,微軟的文件中說明著這一點:

"Netscape developed the JavaScript programming language. JScript is the Microsoft implementation of ECMAScript, as defined by the specification of Ecma International. Both JavaScript and JScript are ECMAScript-compliant languages."

***  對於微軟Scripting技術有興趣的話,可以參考Microsoft Windows Script Technologies

就像在用戶端動態網頁(DHTML)的技術當中,IE所提供的DOM(Document Object Model)也與W3C所規範的略有不同,因此DHTML的開發人員往往需要為了讓程式可以在不同的瀏覽器中呈現效果,而需要撰寫不同版本的Script。而當年開發ASP(Active Server Pages)最麻煩的地方,就是要在動態網頁內容中混用JavaScript與伺服器端的程式,往往讓許多剛入門的開發人員傷頭腦筋......

而ASP.NET的伺服器控制項技術的出現,對於被ASP像義大利麵條似的開發方式搞得昏頭轉向的開發人員而言,無疑的大大減輕了開發動態網頁的步驟:除了Page會自動維護狀態,並根據伺服器端程式處理結果自動轉譯(render)HTML內容之外,許多的伺服器控制項也會根據用戶端瀏覽器自動載入網頁執行所需要的JavaScript。然而,所有的問題都解決了嗎?

事實並非如此,雖然ASP.NET的精神,是希望開發人員只需要會使用伺服器端的程式搭配伺服器控制項,就可以完成開發動態網頁的動作。但是畢竟ASP.NET是以伺服器端為主的開發技術,若是用戶端沒有觸發PostBack動作的話,就無法回伺服器端完成動作;而若是每個動作都PostBack,對於使用者的操作經驗(User Experience)與執行效能也都會有影響。因此在ASP.NET 3.5當中,就整合了ASP.NET AJAX的技術到其中,將ASP.NET伺服器控制項的功能發揮到極致 -- 而開發人員只要學會將伺服器控制項放到UpdatePanel控制項當中,再加上一些程式與設定,就可以完成以前ASP需要寫一堆程式才可以完成的結果!!

然而,ASP.NET技術也不是沒有限制的:

首先,ASP.NET依賴伺服器端控制項與Page物件維護其頁面中的狀態,因此造成維護使用者狀態及切換頁面的邏輯不易獨立設計,造成ASP.NET不易實作MVC設計模型。

再者,ASP.NET 3.5雖然整合了ASP.NET AJAX技術,但是因為並非每一個用戶端的事件(OnMouseMove、OnBlur....等等) 伺服器控制項都有支援,因此仍然有許多的動態效果是ASP.NET無法直接支援的(先天的限制,非戰之罪....)。雖然我們可以透過ASP.NET的ClientScriptManager動態載入必要的自訂JavaScript,滿足用戶端所需要的動態效果;但若是可以讓網際網路開發人員在不需要透過任何其他的技術(Java,或是任何Java開頭的......) 就可以完成用戶端動態效果的開發,那世界豈不是更美好!!!

(未完待續.............)

2008年8月16日 星期六

又見火星文......

最近公司同事拿一本中文書給大家參考,隨便翻開一頁,標題寫著:

"單一孩子的Element"

        ==> 我才知道程式設計也講一胎化.............. Orz

"孩子內部還是可以有別的孩子"

        ==> 太深奧了,是靈異小說嗎? "專業"的編輯出來說明一下吧?

其他的部分就懶得看了,還好我手上有那本的原文書............

2008年8月14日 星期四

Silverlight 2 講堂 - 17:透過WCF與Server端程式整合

原本這一堂課應該繼續介紹Silverlight 2.0應用程式開發觀念(3),但是我想目前透過Silverlight 2 講堂 -14:Silverlight 2 應用程式開發觀念(1)Silverlight 2 講堂 -16:Silverlight 2 應用程式開發觀念(2)兩堂課,大家對於Silverlight 2.0應用程式的開發應該已經有一些基本觀念了;再加上這星期剛好我在恆逸資訊開WF(Windows Workflow Foundation)的課程,因為課程內容東西太多,今天又是最後一次上課,所以我想先插入一堂介紹Silverlight 2.0應用程式如何透過WCF(Windows Communication Foundation),在新一代分散式架構中與Server端程式整合的課程,一方面讓WF課程的學員可以對於我在課堂中所介紹的.NET分散式架構可以有更清楚的概念,另一方面,這也是你未來要開發Silverlight 2.0應用程式時,相當重要的一個關鍵技術。Silverlight 2.0應用程式開發觀念(3),就順延推出吧!

在前面的技術文件--淺談新一代的MVC設計模式 -2--中,就已經揭露了"新一代ASP.NET應用程式的發展,已經不再是以"網頁"、"Web表單"為中心,而是改以"工作流程"為主要的設計中心"的觀念;而在"軟體即服務"(Software as a Service)的概念之下,搭配WCF的技術,我們可以更進一步的說:"新一代應用程式的發展方式,就是以"工作流程"為主要的設計中心,再搭配不同的前端介面供使用者操作"。而其中一種前端介面,就是Silverlight 2.0應用程式。

Silverlight 2.0應用程式是發展新一代分散式系統很好用的前端展示層介面(View)技術,怎麼說呢? 因為在Silverlight 2.0的執行環境當中,雖然提供了BCL,但是受限於瀏覽器的關係,有很多的動作與用戶端環境的資源無法直接完全存取(例如:檔案系統),因此必須要搭配Server端的控制元件與模組,才能發展完整的功能。我會在另一篇文章中比較Silverlight 2.0與ASP.NET開發技術的差異,以及介紹發展新一代分散式系統架構的設計模式(好像又拖稿了.......);這一堂課,我們先來介紹如何將前端的Silverlight 2.0應用程式透過WCF技術結合後端的WCF服務元件;而聽過我的WF課程的同學,你可以更進一步的試著將Server端的工作流程先透過State Machine Workflow設計好,發佈成WCF服務之後,再套用在這裡為各位介紹的模型中。

1. 首先,開啟VS 2008 開發工具,新增一個Silverlight應用程式專案以及測試網站,取名為WCFHelloWorld。

2. 使用Expression Blend 2.5 設計工具開啟WCFHelloWorld專案,從左邊工具列中拖放兩個TextBox控制項、一個Button控制項,空間配置如下圖:

快照1

2. 在[Properties]視窗中,將上面的TextBox控制項命名為"txtName",下面的TextBox控制項命名為"txtAnswer"。

3. 將WCFHelloWorld專案存檔,然後先建置專案(Build Solution)一次,關閉Expression Blend設計工具。

4. 回到VS 2008開發工具中,在測試的網站專案(名稱應該預設叫WCFHelloWorldWeb)中,按下滑鼠右鍵,選擇[加入新項目],你會看到如下圖的[加入新項目]視窗:

快照2

5. 重點來了,在[加入新項目]視窗中你會看到一個叫做[Silverlight-enabled WCF Service]的項目。要建立給Silverlight 2.0應用程式存取的WCF服務元件,你不一定要選這一個項目;但是選擇這一個項目建立WCF服務元件時,VS 2008會幫你將WCF組態自動設為BasicHttpBinding繫結,所以就算你還不懂WCF技術也可以先練習。

*** 若是你想使用Silverlight 2.0技術開發應用程式,基本的WCF與WF技術操作技巧還是必須要知道。若是你目前還沒有這兩種技術的基礎,建議你可以先參考我的"Visual C# 2008精研講座"這本書後半部的章節。

在[加入新項目]視窗選取[Silverlight-enabled WCF Service]項目之後,將[名稱]設為MyService.svc,然後按下[加入]按鈕。

6. 此時VS 2008 開發工具應該會自動開啟在App_Code目錄下的MyService.cs原始檔,在原始檔中將DoWork方法程式調整如下:

    [OperationContract]
    public string DoWork(string username)
    {
            // Add your operation implementation here
            return "Hello, " + username +
                ". Time is " + DateTime.Now.ToLongTimeString();
    }

完成之後先存檔,然後建置一下網站專案。

7. 在WCFHelloWorld專案中按下滑鼠右鍵,選取[加入服務參考]。接著按下[加入服務參考]視窗中的[探索]按鈕,VS 2008就會自動找到剛剛加入到WCFHelloWorldWeb專案中的MyService服務的定義。將[命名空間]設為"MyServiceReference"之後,按下[確定]按鈕,VS 2008開發工具就會在WCFHelloWorld專案中建立存取WCF服務所需要的代理元件(proxy)的定義。

快照4

8. 開啟Page.xaml檔案,在XAML編輯器中,建立Button控制項的Click事件對應的事件處理常式(Button_Click),然後按下滑鼠右鍵,選取[巡覽至事件處理常式]。

9. 在Click事件處理常式中,加入建立存取WCF服務的Proxy元件的程式如下:

MyServiceReference.MyServiceClient proxy
    = new WCFHelloWorld.MyServiceReference.MyServiceClient();

10. 在Silverlight 2.0應用程式中,Proxy元件是以非同步方式呼叫WCF服務的。因此接下來,先註冊當Proxy元件以非同步方式呼叫WCF服務執行完成時,所會觸發的事件的處理常式;然後再呼叫Proxy元件以非同步方式呼叫WCF服務。完整的Click事件處理常式程式碼如下:

private void Button_Click(object sender, RoutedEventArgs e)
{
        MyServiceReference.MyServiceClient proxy
            = new WCFHelloWorld.MyServiceReference.MyServiceClient();

        //註冊接收結果的事件處理常式
        proxy.DoWorkCompleted += new EventHandler

               <WCFHelloWorld.MyServiceReference.DoWorkCompletedEventArgs>  

                (proxy_DoWorkCompleted);

        //以非同步方式呼叫WCF服務功能

        proxy.DoWorkAsync(txtName.Text);
}

11. 接下來在proxy_DoWorkCompleted方法中,透過第二個DoWorkCompletedEventArgs

型別參數的Result屬性取出WCF執行結果,並顯示在txtAnswer控制項中:

void proxy_DoWorkCompleted(object sender, WCFHelloWorld.MyServiceReference.DoWorkCompletedEventArgs e)
{
    Dispatcher.BeginInvoke(delegate()
    {
        txtAnswer.Text = e.Result;
    });
}

12. 完成之後建置WCFHelloWorld專案,然後開啟HTML或是ASP.NET測試網頁執行。輸入名字之後,按下按鈕就可以呼叫WCF服務,測試結果如下:

快照6

如果你需要很炫的效果的話,你可以利用前面學過的技巧加上一些動畫效果就可以了。你可以參考:Silverlight 2 講堂 -3:讓畫面動起來這一篇前面的課程。

很多人在Silverlight 1.0的時代,就被一些錯誤的資訊誤導,以為Silverlight是要用來對抗Flash的技術,所以Silverlight的重點技術是動畫與多媒體。在上完這堂課之後,你就會發現,Silverlight 2.0技術的真正精髓,是在於結合了.NET平台技術之後,就可以透過各種不同方式,與Server端的程式進行整合。後面的課程我將會陸續再介紹其他的整合技巧與應用,敬請期待喔!!

2008年8月12日 星期二

Microsoft Dream Park

剛剛瀏覽網站,發現微軟提供了下面的免費資源給學生使用:

https://downloads.channel8.msdn.com/

只要你是學生,就可以"免費"下載微軟的開發工具,如VS 2008專業版。但是目前只有提供給下列國家:

United States, the United Kingdom, Canada, China, Germany, France, Finland, Spain, Sweden, Switzerland and Belgium

If you are not residing in one of the countries listed keep checking back, we will be adding more countries throughout the year.

如果大家有興趣,發起一人一信看看可不可以早一點把台灣的學生也加入計畫中.......

Silverlight 2 講堂 -16:Silverlight 2 應用程式開發觀念(2)

Silverlight 2 講堂 -14:Silverlight 2 應用程式開發觀念(1)中,我們介紹了Silverlight 2.0 應用程式開發的基本觀念,那就是每一個Silverlight 2.0應用程式專案都是單獨封裝之後,再動態的載入到用戶端瀏覽器Silverlight嵌入式控制項所建立環境中執行。接下來這一堂課,讓我們更深入了解介紹Silverlight 2.0應用程式的啟動過程。

當每個Silverlight應用程式專案建立時,VS 2008會幫你建立兩個專案:Silverlight應用程式專案與測試用的Web應用程式專案(參考Silverlight 2 講堂 -2:建立專案--使用VS 2008)。每個Silverlight應用程式專案中的App物件(App.Xaml、App.Xaml.cs)就是Silverlight應用程式載入到用戶端之後開始執行的進入點,但是在此之前,每個Silverlight應用程式專案在開發好之後,都必須要透過VS 2008專案的建造(build)的功能,先編譯成.NET組件(dll)。以TimerSample範例專案為例,當專案建造完成之後,你可以透過檔案總管到專案的Bin\Debug目錄下,找到下面的幾個主要輸出檔案:

  • AppManifest.xaml
  • TimerSample.dll
  • TimerSample.xap

其中,TimerSample.dll就是你的Silverlight 2.0應用程式所建造出的組件,而AppManifest.xaml的用途,就是用來宣告構成Silverlight 2.0應用程式進入點所需要的Application類別名稱與組件檔案名稱,內容如下:

<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="TimerSample" EntryPointType="TimerSample.App" RuntimeVersion="2.0.30523.6">
  <Deployment.Parts>
    <AssemblyPart x:Name="TimerSample" Source="TimerSample.dll" />
  </Deployment.Parts>
</Deployment>

但是真正要部署到網站中使用的檔案,卻是專案輸出目錄中的XAP檔(TimerSample.xap)。XAP檔案其實是ZIP格式的壓縮檔,如果你將副檔名改成zip,就可以使用ZIP工具解壓縮或開啟,裡面包含了兩個檔案:

  • AppManifest.xaml
  • TimerSample.dll
  • 換句話說,Silverlight 2.0應用程式專案中的程式與啟動點的定義,就可透過XAP檔載入到用戶端瀏覽器中的Silverlight嵌入式控制項中執行,在HTML網頁中,你可以透過下面的<Object>標籤載入在網站ClientBin子目錄下的XAP檔:

    快照2

    而在System.Web.UI.SilverlightControls命名空間中提供了Silverlight 2.0 Server Control,因此在ASP.NET表單中也可以使用下面方式設定載入Silverlight 2.0應用程式到用戶端:

    <%@ Register Assembly="System.Web.Silverlight" Namespace="System.Web.UI.SilverlightControls"
        TagPrefix="asp" %>

    <asp:Silverlight ID="Xaml1" runat="server" Source="~/ClientBin/TimerSample.xap" MinimumVersion="2.0.30523" Width="680" Height="150" />

    這些封裝在XAP檔中,當Silverlight嵌入式控制項啟動時一次載入,且為Silverlight應用程式啟動時所必要的檔案,稱為In-Package檔案。但是若是一個複雜、而且橫跨多種UI的Silverlight應用程式(例如Get the Glass的這種,雖然它不是用Silverlight技術開發的),你就不可能要求要將所有的資源都下載到用戶端之後,程式才開始執行;一定是程式一邊執行,一邊根據執行狀態向Server端要求即時下載。如果是這樣,你就可以將一些可以在Silverlight應用程式啟動之後再下載的程式碼與UI的定義,以Silverlight類別庫的方式建立,與可以隨機下載的資源另外封裝成On-Demand的檔案,部署到網站中隨著程式執行需要即時下載。因此完整的Silverlight 2.0應用程式的部署架構如下:

    簡報2

    至於如何建立這些可以隨著Silverlight 2.0應用程式執行而下載的資源,會安排在後面的講堂課程中繼續介紹。在今天這堂課的最後,我們來整理一下在用戶端瀏覽器中,Silverlight嵌入式控制項的執行過程:

    1. 首先,由瀏覽器啟動Silverlight嵌入式控制項,並根據Source參數設定的路徑,從Server端下載XAP檔。
    2. 接下來,由Silverlight嵌入式控制項建立Silverlight 2.0應用程式在用戶端瀏覽器中所需要的執行環境。
    3. 將應用程式封包(XAP檔)中的組件與資源,載入到執行環境中。
    4. 根據應用程式封包的Metadata(AppManifest.xaml)的敘述建立Application物件,開始執行Silverlight應用程式。

    而當Silverlight應用程式開始執行時,Application物件的預設建構子(或自訂的沒有參數建構子)就會被呼叫,然後程式開始執行。當Silverlight 2.0應用程式啟動之後,會觸發Application物件的Startup事件;而當Silverlight 2.0應用程式要結束執行時,則會觸發Application物件的Exit事件。關於Application物件的生命周期中的這些事件,我們下一堂課繼續介紹。

    2008年8月11日 星期一

    Silverlight 2 講堂 -15:Silverlight 外傳(WPF篇)

    今天在上WF的課,講解到.NET 3.5 以後的分散式應用程式的開發技巧,剛好有談到Silverlight的歷史,順便在講堂中跟各位分享一下。

    Silverlight原本是叫做WPF/E,E表示Everywhere的意思。但是應該已經沒有多少人知道,事實上在一開始,WPF的設計目標,就是希望透過一個統一的展示模型架構,將來開發人員只需要建立一套UI,就可以在所有的裝置中使用(Design once,show anywhere ?)。但是後來進行了沒多久,就發現了這是一個不可能的任務,所以WPF就分成了所謂的Window模式與Page模式兩種開發與執行環境,其中:

      1. Window模式:開發完成之後直接封裝成一般的可執行檔,然後在.NET用戶端機器中執行。
      2. Page模式:開發完成之後封裝成可裝載到支援XAML的.NET用戶端瀏覽器(IE6、IE7)當中執行。

    因此在VS 2008的專案範本中,你會看到有兩種WPF的專案範本:

    快照1

    其中,"WPF應用程式"就是Window模式,"WPF瀏覽器應用程式"就是Page模式。雖然在區分成兩種環境之後,雖然WPF透過Page模式變成"有希望"可以到處執行了,但是實際上,因為Page模式還是需要在有.NET Framework的環境中執行,再者網際網路是一個開放式的平台,其他的瀏覽器廠商以及使用者(特別是其他作業系統的使用者),不見得希望以及需要這些東西。所以WPF雖然分成了兩種模式,但是實務上離"Everywhere"似乎還有一大段距離.......

    眼看著WF、WCF的開發技術陸續final,WPF進度一直卡在這裡也不是辦法,因此有了WPF/E的新架構模式出現 -- 放棄了透過WPF一統天下的想法,轉而朝瀏覽器嵌入式元件的方式來發展WPF的技術,以符合網際網路的跨平台技術架構(Flash、Applet....)。但在剛從WPF/E發展出來的Silverlight 1.0當中,我個人是認為因為當初開發團隊仍想延續WPF透過XAML一統天下的精神,因此在Silverlight 1.0的環境當中,才會採用了JavaScript+DOM+XAML的架構 -- 但這是註定不會紅的架構! 因為目前在瀏覽器中透過DHTML(JavaScript+DOM)就已經可以完成許多動態的效果,Silverlight 1.0雖然有3D與多媒體效果的加持,但是JavaScript天生不易與Server端直接整合的特性(不是不能,但是很麻煩),加上多媒體部分與Flash的功能重疊,以及嵌入式裝置的瀏覽器也不一定支援JavaScript(支援的物件模型也不盡相同),因此推出不久之後,微軟應該就發現到這是一個死胡同。

    於是乎,在Silverlight 2.0當中,採用了綜合ASP.NET與Java Applet的做法:設計時像ASP.NET表單一樣,將UI的部分透過XAML Designer設計(Expression Blend)之後,在透過VS 2008加上程式;執行之前再編譯成組件,載入到Browser當中執行。你可以參考下圖的比較:

    簡報1

    當然,為了適應瀏覽器的執行環境,所以在Silverlight 2.0的用戶端安裝程式中,安裝到瀏覽器中的.NET Framework只是一個"精簡版",但是已經足夠應付大部分用戶端執行的需求了! 因為在Silverlight 2.0的執行環境當中,提供了對於WCF服務的支援,因此讓瀏覽器中執行的Silverlight 2.0應用程式,可以隨時在需要時動態的與Server端的服務結合,獲得需要的資源。如此一來,你就可以不需要在每一台用戶端機器上安裝完整的.NET Framework,就可以透過用戶端的瀏覽器執行在Server端以服務方式執行的軟體功能(Software as a Service)! 雖然不是真正的透過WPF統一所有平台的展示層技術,但是卻換得了在更多異質平台中執行.NET應用程式的可能性,也算是"塞翁失馬,焉知非福"啊!!

    "外行的看熱鬧,內行的看門道",如此一來,各位"開發人員"應該知道,Silverlight 2.0應用程式技術的重點,絕對不是甚麼動畫效果、多媒體效果那些東西,在網路行事曆、網路Email、網路相簿,網路文書編輯器、網路磁碟機(SkyDrive)等等新型態網路服務技術出現之後,作業系統的功能慢慢的可以被網路平台取代,以Silverlight 2.0技術結合Server端的這些服務,未來要發展"Windows as a Service",相信也是不無可能的。

    2008年8月8日 星期五

    問題與回應(08/08)

    1.

    請問一下我可以在練習完成之後,將部分練習的步驟和完成的結果引用到我的網站上嗎?

    ==>

    沒有問題的! 會開這樣一個線上講堂,就是希望可以讓大家可以多認識這一項技術,只要不是整篇複製,應該是沒有問題,但是方便的話請在你的文章中加註參考的來源。如果你可以順便Email你的網址給我的話最好,因為過陣子我會把大家的網址整理一下放在我的Blog中,可以互相交流一下作品。

    2.

    請問一下我要到哪裡下載範例的程式碼?

    ==>

    目前Silverlight 2.0線上講堂的課程範例暫時沒有提供線上下載的計畫,主要的原因有:

    a. 我上課的習慣是帶大家實作,特別是Silverlight 2.0跟設計以及開發工具之間的相依性很高,你如果不會使用工具,那我提供範例給你也沒太大幫助。

    b. Silverlight應用程式開發必須要跟網頁設計一起進行,我的範例通常只有開發技巧的重點,如果你了解了操作步驟之後,應用在你自己的網站或是作品中,應該效果會更好。

    3.

    請問線上講堂後面的課會不會就開始收費?

    ==>

    Silverlight 2.0線上講堂是完全免費的!!

    目前暫定寫到80~ 100堂課,把我在Silverlight 2.0應用程式開發的心得完全分享給大家參考! 如果後面有些沒寫到的部分,各位也可以Email給我,我再加入到講堂中。

    2008年8月7日 星期四

    Silverlight 2 講堂 -14:Silverlight 2 應用程式開發觀念(1)

            在完成了前面幾個經典的簡單範例效果之後,接下來,在開始進入到更深入的程式開發之前,讓我們先了解一下Silverlight 2 應用程式開發的一些基本觀念,順便解決各位的一些疑惑。

            首先,在安裝完上課操作的環境之後,你會發現在VS 2008的[新增專案]視窗中,就會多了Silverlight的專案類型以及兩個新的專案範本:Silverlight應用程式以及Silverlight類別庫,如下圖:

    快照1

            兩種專案範本的差別,主要在於Silverlight應用程式專案是用來開發可以下載到用戶端瀏覽器中直接執行的程式,而Silverlight類別庫,則是用來封裝可以重複用於不同專案的邏輯,或是應用程式啟動之後需要的額外資源。讓我們先從Silverlight應用程式專案開始認識起,首先,先看一下下面的幾個用Flash技術建立的網站樣版:

    1. MagV.com

    2. MMA標會理財網

    3. Get the Glass

    從這三個網站中,我們不難看出,所謂的RIA應用程式,在前端執行的時候,可以單純的以個別的小型動態控制項的方式嵌入(樣版 1),或是以媒體播放器的方式嵌入(樣板 2),或是占滿整個頁面範圍執行(樣板 3)。這三種不同的嵌入方式,也會影響到我們在開發Silverlight 2.0應用程式時,版面的安排方式。但不管你使用的是哪種方式,別忘了,我們現在所建立的是Silverlight 2.0的"應用程式",而非Silverlight 2.0"控制項" ! 因此在網頁中執行的時候,Silverlight 2.0應用程式跟一般所謂的"應用程式",都會有下面的基本特性:

    1. 必須有進入點(entry point)。

    2. 當應用程式啟動之後,會啟動應用程式自己的執行環境;而且在應用程式執行環境中,一定提供共享(公用)資料暫存的環境。

    根據這樣的觀念,我們就先來認識一下Silverlight 2.0應用程式的"進入點"。當我們建立Silverlight應用程式專案時,除了Page.xaml之外,各位一定會發現到還有一個名為App.xaml的檔案被建立起來。若是你更進一步的去檢視其程式檔App.xaml.cs的程式碼內容的話,你會發現下面的程式碼:

    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 Page();
    }

            在Silverlight 2.0應用程式中,作為應用程式啟動點的就是這一個繼承自System.Windows.Application的物件。因此在每一個應用程式專案中,都必須要定義一個繼承自Application的啟動類別(預設為App),將來當網頁載入Silvelight嵌入控制項時,瀏覽器就會根據控制項的source的屬性,從Server端載入Silverlight應用程式專案建造出來的xap檔中,找到啟動類別的定義建構Application物件,並執行你所定義的動作或是程式。

            因此,各位必須要有一個正確的觀念,就是每個我們在Expression Blend 2.5或是VS 2008當中所建立的Silverlight應用程式,都是要載入到網頁中的Silverlight嵌入控制項執行的。因此若是你所要建立的效果,是像前面介紹的網站樣版1的話,你就必須要建立多個不同的Silverlight應用程式,設計網頁中不同位置所需要呈現的不同效果;而若是你希望建立的是動態的網站首頁(例如樣板2的效果),或是橫跨不同表單範圍的動態效果的話(例如:樣板3),那你就可以只建立一個Silverlight應用程式專案,載入到用戶端瀏覽器後顯示即可。

    介紹到這裡,各位可以先做一個小小的練習:

    1. 使用VS 2008開起上次製作的TimeSample專案以及MyCarousel專案。

    2. 在測試用的TimeSampleWeb網站中,找到ClientBin子目錄,按下滑鼠右鍵選取[加入現有項目],然後從MyCarousel專案目錄的Bin\Debug子目錄中,將MyCarousel.xap檔案加入。

    3. 接下來,將 MyCarouselWeb測試專案當中的HTML測試網頁開啟。開啟後將網頁中的<object> ... ...</object>標籤範圍中的內容,複製到TimeSampleWeb網站的測試網頁的HTML內容中。

    4. 完成之後開啟TimeSampleWeb網站的測試網頁,你會發現到前兩個練習的結果,就會在同一個網頁中顯示,而且不會互相影響!

    接下來的幾堂課中,我們會再繼續更深入的討論Silverlight 2.0應用程式的生命周期與執行架構。

    2008年8月6日 星期三

    問題與回應(08/06)

    1.

    請問在Silverlight 2 講堂 -13:使用Timer建立圖片輪播器[程式]中的下列的2段CODE 要如何轉換成VB的程式嗎呢?

    public Page()
    {
        InitializeComponent();
        _images = new Image[] { image, image1, image2, image3 };
        this.Loaded += new RoutedEventHandler(Page_Loaded);

    }

    void LoadPictures(object obj) {

        this.Dispatcher.BeginInvoke(
            delegate (){
                MakeIndexRight();
                ResetImageSource();
                Scorlling.Begin();
            }
         );
    }

    ==>

            首先說明的是,第一段程式其實也可以直接在XAML的標籤中設定UserControl的事件,然後再透過VS 2008開發工具的[巡覽至事件處理常式]功能,就可以加入Page_Loaded的事件處理常式:

    快照2

            在VB程式中,若是要跟範例一樣動態註冊事件處理常式的話,就要改用AddHandler指令,程式碼如下:

    Public Sub New()
        InitializeComponent()
        _images = New Image() {image1, image2, image3, image4}
       AddHandler Me.Loaded, AddressOf Page_Loaded

    End Sub

        而第二段程式中,因為使用了C#的匿名方法指定,所以程式較為簡潔。若是要改成VB的程式的話,建議步驟:

    1. 先定義一個沒有接收參數的Delegate:

    Public Delegate Sub NoArgsDelegate()

    2. 然後再建立一個UpdateUI的方法,觸發更新UI的動作:

    Public Sub UpdateUI()
        MakeIndexRight()
        ResetImageSource()
        Scrolling.Begin()
    End Sub

    3. 再透過Delegate物件,將UpdateUI方法註冊到Dispatcher物件的工作佇列中:

    Private Sub LoadPictures(ByVal obj As Object)

        Me.Dispatcher.BeginInvoke(New NoArgsDelegate(AddressOf UpdateUI))

    End Sub

     

    2.

            請問老師可以不可以提供VB的範例程式碼?

    ==>

            這一點稍微抱歉,因為目前Silverlight 2講堂的內容還有很多要推出,所以暫時我的範例會先以C#為主。其實大部分的程式我都會加上說明,因此使用VB的朋友也可以試著寫寫看,有問題可以跟我說,我可以先把一些比較複雜的程式轉成VB程式碼給各位參考。等到講堂內容完成之後,我也會另外再製作一份VB版的範例程式,給使用VB開發的朋友參考。

    2008年8月5日 星期二

    Silverlight 2 講堂 -13:使用Timer建立圖片輪播器[程式]

            在跑馬燈的課程當中,曾經教過如何在程式中建立BitmapImage物件,以及如何動態的將圖片套用到Image控制項當中。如果你有做出前一個練習的話,相信對於這動態切換圖型的技巧應該會有印象。但這一個練習要做的是會自動循環播放照片的圖片輪播器,不像是跑馬燈是使用者用滑鼠點選之後才開始播放的。換句話說,我們必須要在表單的背景當中,建立一個新的執行緒幫我們定時觸發時間軸更換照片。

            天啊! "執行緒"! 會不會太難了一點?? 其實一點也不會。Silverlight 2當中最棒的就是內建了Base Class Library(BCL),讓開發人員不需要花太多時間就可以開發互動式的前端程式。如果你有來恆逸聽過2956等進階的課程,就可以使用.NET應用程式中多執行緒應用程式開發技巧完成這一個功能。當然,我是假定各位沒有接觸過 -- 那也沒關係,因為Silverlight 2執行環境中的BCL(後面稱為 "Silverlight 2 Library" )相對於.NET Framework來說只是一個Micro Edition(.NET ME ??),因此只要跟上我們的進度也一樣可以學會。

            開發程式之前,你可以先下載Microsoft® Silverlight™ 2 Software Development Kit Beta 2,裡面包含了Silverlight 2 Library API的說明文件,對於你開發Silverlight程式會很有幫助。在Silverlight 2 Library當中,跟.NET Framework一樣提供了System.Threading命名空間,定義了Thread等類別,可以用來建立多執行緒的程式。這一個練習中,我們要使用的是System.Threading命名空間中的Timer物件,來幫我們觸發定時的工作。

    1. 使用VS 2008開發工具開啟TimerSample專案,開啟Page.xaml.cs 程式檔。

    在Page.xaml.cs程式檔前面,先宣告引用System.Windows.Media.Imaging以及System.Threading命名空間:

    using System.Windows.Media.Imaging;
    using System.Threading;

    2. 在Page類別定義中,宣告一個BitmapImage型別的陣列成員,用來暫存要輪播的六張圖片:

    private BitmapImage[] _pics = {
        new BitmapImage(new Uri("1.JPG",UriKind.Relative)),
        new BitmapImage(new Uri("2.JPG",UriKind.Relative)),
        new BitmapImage(new Uri("3.JPG",UriKind.Relative)),
        new BitmapImage(new Uri("4.JPG",UriKind.Relative)),
        new BitmapImage(new Uri("5.JPG",UriKind.Relative)),
        new BitmapImage(new Uri("6.JPG",UriKind.Relative)),
                                  };

    3. 宣告一個整數成員變數,用來記錄目前button1所顯示的圖片在_pics陣列中的索引值,預設為零:

    private int _index = 0;

    4. 再宣告一個Image型別的陣列,用來記錄所有Button控制項上的Image控制項。然後在Page類別的建構函式中,將Image控制項記錄到陣列中:

    private Image[] _images;

    public Page()
    {
            InitializeComponent();
            _images = new Image[]{ image1,image2,image3,image4 };
    }

    5. 在Page類別定義中加入一個MakeIndexRight方法調整顯示圖片的起始索引值:

    private void MakeIndexRight()
    {
        _index = (_index + 1) < 6 ? (_index + 1) : 0;
    }

    6. 接下來,建立一個ResetImageSource方法,根據圖片的起始索引值將新圖片套用到image控制項上:

    private void ResetImageSource() {
        int index = _index;

        //要先清除圖片的參考
        foreach (Image img in _images)
        {
            img.Source = null;

        }
        foreach (Image img in _images)
        {
            img.Source = _pics[((index < 6) ? index : (index - 6))];
            index++;
        }
    }

    7. 接下來建立Timer定時器,首先在Page類別定義中,宣告一個Timer型別的實體變數,取名為_timer:

    private Timer _timer;

    8. 當UserControl載入完成時,才要建立並啟動Timer物件。因此在Page類別建構函式中註冊Loaded事件的事件處理常式:

    public Page()
    {
        InitializeComponent();
        _images = new Image[] { image, image1, image2, image3 };
        this.Loaded += new RoutedEventHandler(Page_Loaded);

    }

    9. 接著在Page_Loaded方法中,建立Timer物件,Timer的建構函式必須要傳入下面參數:

    new Timer(TimerCallback委派物件, 狀態物件, 啟動前延遲時間, 間隔時間);

        其中,TimerCallback委派物件必須要參考到一個接收Object型別、沒有回傳值的方法,用來定義每次Timer啟動時所要執行的工作;而"啟動前延遲時間"和"間隔時間"的單位是毫秒。我們要設定Timer物件每4秒啟動一次,因此在Page_Loaded方法中加入程式如下:

    void Page_Loaded(object sender, RoutedEventArgs e)
    {
        _timer = new System.Threading.Timer(
            new System.Threading.TimerCallback(LoadPictures),
            null,0, 4000);

    }

    10. 最後,建立Timer物件每次啟動時,透過TimerCallback委派物件所呼叫的LoadPictures方法。根據TimerCallback委派的規格,LoadPictures方法為接收Object型別、沒有回傳值的方法。

          但是更重要的是,就是由於Timer物件執行在背景執行緒中,因此不具備有存取使用者操作介面控制項的權利,因此我們必須要將Timer物件更新使用者操作介面的工作,暫存到UI執行緒用來佇列工作項目的Dispatcher物件中(與WPF原理相同,可參考Visual C# 2008精研講座第18章)。因此,在LoadPictures方法中,我們先將啟動Scrolling時間軸的工作定義成一個匿名方法,然後透過Dispatcher物件的BeginInvoke方法,註冊到Dispatcher物件中:

    void LoadPictures(object obj) {

        this.Dispatcher.BeginInvoke(
            delegate (){
                MakeIndexRight();
                ResetImageSource();
                Scorlling.Begin();
            }
         );
    }

    在Silverlight 2與WPF中,這一個技巧相當的重要!

    11. 建置專案,然後在測試網頁中,將Silverlight控制項的Width屬性值設為680,Height屬性值設為150。

    點這裡試試程式的執行結果

    如果連結無法開啟,請先看下面影片:

    除了Timer之外,你也可以使用其他定義在System.Threading命名空間中的物件類別產生新的執行緒。這一個練習我們就先做到這裡,完成之後你可以將圖片輪播器崁入到HTML頁面中,產生動態播放的效果。

    2008年8月4日 星期一

    Silverlight 2 講堂 -12:使用Timer建立圖片輪播器[介面、動作]

    這次的目標,我們希望建立一個圖片輪播器。跟上次的跑馬燈效果稍微不同,像下面網站的效果:

    http://tw.magv.com/AD0707PH.html?WT.mc_id=M0801 

    1. 首先,先開啟VS 2008,建立一個TimerSample的Silverlight應用程式專案。

    2. 接下來,使用Expression Blend 2.5開啟TimerSample專案。使用[Properties]-->[Layout]視窗將控制項範圍訂為680x150。

    3. 在預設的Grid控制項中加入一個Canvas,大小為1080x150。

    4. 選取並移動Canvas控制項,將Canvas控制項的位置調整到UserControl的正中央(左Margin = -200);然後在專案中加入六張圖片,依序編號為 1.JPG~6.JPG。

    5. 將第一張圖編拖曳到Canvas控制項上,按下[ALT]鍵再移動滑鼠,將Iamge控制項崁入Cnavas控制項中。接著,從[Properties]-->[Layout]視窗中,設定Left = 0,Top = 0,Width = 200,Height = 150,Name = image1。

    6. 將第二張圖編拖曳到Canvas控制項上,按下[ALT]鍵再移動滑鼠,將Iamge控制項崁入Cnavas控制項中。接著,從[Properties]-->[Layout]視窗中,設定Left = 220,Top = 0,Width = 200,Height = 150,Name = image2。

    7. 將第三張圖編拖曳到Canvas控制項上,按下[ALT]鍵再移動滑鼠,將Iamge控制項崁入Cnavas控制項中。接著,從[Properties]-->[Layout]視窗中,設定Left = 440,Top = 0,Width = 200,Height = 150,Name = image3。

    8. 將第四張圖編拖曳到Canvas控制項上,按下[ALT]鍵再移動滑鼠,將Iamge控制項崁入Cnavas控制項中。接著,從[Properties]-->[Layout]視窗中,設定Left = 660,Top = 0,Width = 200,Height = 150,Name = image4。

    完成結果如下:

    快照1

    ***  你可以隨時將滑鼠移置畫布後,按下[Tab]鍵,就可以隱藏設定用的視窗。

    9. 因為只需要一個方向移動,因此參考下面的設定,建立一個名為Scrolling的時間軸:

    簡報1

    10. 在Canvas控制項中加入一個680x150大小的Retangle,從[Properties]-->[Layout]視窗中,設定Left = 200,Top = 0。然後再[Properties]-->[Brushes]視窗中,選取Fill屬性旁的小方塊,選取Reset(清除填滿);然後將[Appearance]視窗中的StrokeThickness屬性設為5:

    快照2

    11. 建立一個Retangle,透過[ALT]鍵與滑鼠崁入Canvas中,設定Left = 200, Top = 0, Width = 20, Height = 150。

    12. 建立一個Retangle,透過[ALT]鍵與滑鼠崁入Canvas中,設定Left = 860, Top = 0, Width = 20, Height = 150。

    完成之後可以先執行Scrolling時間軸看一下效果,並將專案存檔。

    2008年8月3日 星期日

    問題與回應(08/02)

    1.

    請問老師,我在操作Silverlight 2 講堂 -10:跑馬燈中傳(動作)時,發現我的Button控制項無論如何只能調整大小,但卻無法移動位置,是什麼原因呢?

    ==>

        關於這一點,很抱歉是我在前一堂課Silverlight 2 講堂 - 9:跑馬燈前傳(操作介面)的操作步驟4 當中,沒有說明清楚所有的Button控制項要放在Canvas中操作,我已經做了一些更正,你可以回到第9堂課再看一下。不過在Silverlight 2 講堂 -5:排版當中,我有簡介過透過Canvas控制項,我們才可以在表單中決定控制項的相對位置的觀念,你可以回去看看,再多練習一下喔!!

    2.

    我想問 如果想寫一個網頁
    裡面會用到多個SILVERLIGHT 的 OBJECT/動畫 E.G. BANNAR, MENU, INTRO ...ETC
    這樣是不是每一個SILVERLIGHT 的 OBJECT/動畫我都要建立一個專案?
    你的新TOPIC 寫了無言的結局
    你還會繼續 SILVERLIGHT 講堂嗎?
    會教怎樣在同一個PAGE 中加入多個 SILVERLIGHT 動畫嗎?

    ==>

            關於Silverlight 2的進階開發技巧,會繼續慢慢為各位介紹,目前先著重在UI與程式開發的部分,慢慢的會介紹到資料繫結與架構的部分;控制項封裝部署、多媒體等技巧會放在較後面穿插介紹。

            Silverlight 2線上講堂是我在4月份的時候就計畫要做的(Vista Service Pack 1 & 新計劃),但是因為恆逸的SD講師都爆肝的忙,而認識的開發人員大多又被Silverlight 1.0和開發工具搞得興趣缺缺,最後加上這是線上的講堂,除了幫大家提昇程度之外沒有額外收取費用(有看到喜歡的廣告記得點一下就好),因此最後還是自己來做比較快。雖然行程也是滿檔(你,但是為了幫大家快速而且正確的認識新知識,我想我願意抽時間來完成這一個嘗試性的計畫。

            目前已經進行到第11堂課了,目標是100堂課,希望可以在Silverlight 2正式發表前完成大部分的課程。

    3.

    我嘗試在 expression blend 開啟 我在 vs2008 建立的 silverlight xamp file
    但是他說user control 和 grid 不是 wcf 支援的
    所以在這裏看不見 這個silverlight 的design mode
    同樣我也用不到intellsense
    我用的是 vs2008 pro and expression studio 2
    我是不是需要使 用 blend 2.5 才可以跟隨着你的教學學習?

    ==>

    跟各位抱歉一下,上課的過程當中,如果有遇到環境的問題,我不一定有時間可以幫你嘗試找出解決的方式,因此你可以使用MSDN技術論壇試著尋找答案或是詢問微軟的技術人員。主要是因為目前我們使用的環境當中,有些產品是Beta版,有時會有一些不穩定的情況。上課使用的環境我已經在開課時就說明清楚了,因此請使用我們的環境來操作喔!!

    當然,若是你有發現某個問題的解決方式,也請你通知我,讓我可以貼在Blog中告訴大家。例如以下是屬名"智"的朋友的來信(來函照登),他的問題是在VS 2008中無法使用intellsense功能:

    John 你好
    不好意思... 我找不到我之前遇到的error message
    我是因為見到這句error message 我先想到怎樣解決這個問題的
    error message 跟下面的很相似
    'vs2008.xxxxxx.xxxx Package' has failed to load properly (GUID = {xxxxxxxx}). Please contact package vendor for assistance. Would you like to reinstall this package ? you may use 'devenv/resetskippkgs' to re-enable package loading.
    不好意思...你知不知邊有没有方法可以看之前出現的error message? 如果有...我可以去找找看
    我解決這個問題的方法是
    click to "start menu" -->所有程式 --> Microsoft Visual Studio 2008 --> Visual Studio Tools ---> Visual Studio 2008 Command Prompt
    之後 在COMMAND PROMPT 裏輸入  devenv /resetskippkgs
    之後這個error message 便消失了
    如果你覺得我解釋得不清楚或你想要多一些資料, 請話比我聽
    我會嘗試找多D 資料的
    希望如果將來有朋友看到你的教學時 遇到同樣問題
    這個方法可以幫到他們
    謝謝你今天教我使用 2維 ARRAY
    我繼續看你的教學先
    謝謝你

    Silverlight 2 線上講堂通知(08/02)

    首先,先向各位抱歉一下,因為有朋友反應展示範例結果的影片品質不好,所以我這兩天都在尋找架網站展示範例的方式,主要是因為我沒有很多時間管理跟設定,所以需要簡單一點的Solution。後來由恆逸資訊的Jacky老師推薦我使用DynDNS的解決方案,所以現在暫時先用NB架了一個網站把跑馬燈的範例執行結果放了上去。但是因為這兩天我的電腦還有一些別的事要做,所以可能有時會先關機就會連不上網站;過兩天我會再找一台機器把東西搬過去,到時候就會穩定多了。

    另外再跟各位說一個好消息,那就是因為Silverlight 2有許多操作上的步驟或是問題,雖然我在講堂中已經盡可能的使用文字跟圖片說明,但或許你還是希望看到實際的操作步驟,甚至可以當場發問。為了讓大家在這一個線上講堂的學習效果可以更好,所以目前計畫每一個月開放30分鐘的線上研討時間,我會在LiveMeeting上跟各位展示講堂的範例操作。但因為下半年我的時間排得非常滿,所以八月份的時間我會稍候才公布。但希望各位可以在線上研討開始之前將問題先準備好,透過Blog或是Email先告訴我,這樣我們才可以在最短的時間獲得最大的效果。

    原本預計周末刊出的文章就順延一兩天,謝謝大家的支持!

    最新回應

    Loading...

    即時與版主對話


    (若狀態顯示"忙碌"時,我可能無法馬上回應。你可以留下Email,我會盡快跟你聯絡,謝謝喔!!)