Silverlight 3 中的multi-Touch程式開發

TechDays 2009忙完了,終於有一點點時間可以回頭寫SL3中的多點觸控,隨著Windows 7的Launch在即,我開始屢屢被問到Silverlight 3中的多點觸控程式開發的部分。

在TechDays 2009中也稍微提過,其實SL3中的多點觸控一點也不複雜,架構上相當簡單,底下這是SL3中多點觸控的訊息架構:

從這邊您也不難發現,觸控螢幕(或面板或NB)、Windows 7、IE8當然都是必要設備,缺一不可。

對於SL3應用程式來說,只是很簡單的從IE8接受多點觸控事件,或者是模擬成滑鼠事件。至於很多人關心的可以接收到幾點,端看設備而定,如果設備傳入的是兩點(我手上的觸控螢幕和NB都只支援兩點),傳入SL3的就是兩點;若設備支援多點,SL3就接收到多點,如此而已,沒啥特別的。

要在SL3當中接收到多點觸控的信息,再簡單也不過,最簡單的方式如下,動作只有兩動:
1.Hook Multi-Touch事件
2.在事件中取得點,進行處理或運算。
程式碼如下:

public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
//Hook事件
Touch.FrameReported += new TouchFrameEventHandler(Touch_FrameReported);
}

void Touch_FrameReported(object sender, TouchFrameEventArgs e)
{
//取得點數
int n = e.GetTouchPoints(this.LayoutRoot).Count;
this.textBlock1.Text = "points : " + n;
//將每一點座標顯示出來
foreach (System.Windows.Input.TouchPoint p in e.GetTouchPoints(this.LayoutRoot))
{
this.textBlock1.Text += " \n(" + p.Position.X.ToString("0.00") + "," + p.Position.Y.ToString("0.00") + ") - " + p.Action.ToString();
}
}
}

執行結果:

[範例]

BTW, 這一次範例變成C#了,因為好多人問我要C#的code或是書,因應目前VB/C#還是差不多55波的趨勢,我也不知道到底要寫C#還是VB來的好,總之就隨興寫了,大家就勉為其難和我一起培養 '雙語' 的能力。畢竟這雙語也是一種趨勢嘛...

留言

匿名表示…
忽然發現BLOG旁邊有一本沒看過的書封面才知道老大您又出新書了,怎麼都沒有發一篇文章來公告一下?
匿名表示…
是五五波嗎?依我在天瓏書局的觀察,同時有出C#和VB的書籍,都是C#賣的比較好,能上排行榜,VB連排行榜都進不去的居多。
David寫道…
呵呵,因為那本不是新書啦,是SL2.0的書改版的,SL3的內容在這本書裡面是以PDF的形式蒐錄在DVD中的(所以沒有紙本部分)。

因此,SL3更多的紙本內容會蒐錄在另一本SL3的專書中。
David寫道…
to 匿名,

因為C#是比較多高階市場用戶的,天瓏的書比較屬於中高階市場,如果你把一般入門市場加起來算,我想還是維持差不多五五的比例。

不過確實,C#在持續成長中,因此很有可能未來中高階書籍或是範例我直接寫C#了,畢竟民之所欲,常在我心嘛...^_^
承佑表示…
老師您好
下一本書,希望可以朝書中範例以c#為主,然後光碟附上vb的範例程式碼,畢竟目前國內外或對岸範例均以c#為主,我過去也是看您輸成長的,但目前也是改寫c#,而您對於vb.net的堅持我覺得還是很有必要,書本以c#為主,相信可以有效提升銷售量,而范麗光碟也照顧到目前仍使用vb的讀者。
有好銷量,才有好書。
David寫道…
to 承佑,

呵呵,聽起來讓人蠻心動的,我會認真考慮以後的中高階書籍直接出C#版本的。
承佑表示…
董老師,想請關於多點觸控的問題。
我能否判斷畫面上哪個物件被點擊到。
假設我畫面上擺一個Rectangle,name是r1
以下面的程式來講,只要有點到螢幕,它就會傳回=1,不一定要點到Rectangle。
int n = e.GetTouchPoints(r1).Count;
那r1傳給GetTouchPoints到底是做什麼用?
除了計算座標,有辦法達成判斷畫面上哪個物件被點擊到的功能嗎?
David寫道…
可以透過TouchPoint.TouchDevice.DirectlyOver取得被該觸控點所點選的最上層物件。

相關的資訊我會整理在11月號的RunPC雜誌上發表。
承佑表示…
老師您好
我透過TouchPoint.TouchDevice.DirectlyOver取得的是UIElement,我想要取得該物件的名稱.
假設說我已經知道他是Rectangle,我可以透過
UIElement ue;
ue = p.TouchDevice.DirectlyOver;
Rectangle rec = (Rectangle)ue;
這樣做轉換,但如果我根本不知道user按下的是甚麼,我又該如何判斷呢?
承佑表示…
我剛剛發現了
ue.GetValue(FrameworkElement.NameProperty).ToString();
可以透過這樣取得user點擊的物件的名稱
匿名表示…
請問在董大偉老師 Silverlight範例權威講座2.0的書中,
'建立登入物件
Dim WithEvents LoginFrame As New StudyHost.Login.LoginControl,
該段程式碼中的StudyHost.Login.LoginControl指的是什麼?
請問有附在光碟裡面嗎?

這個網誌中的熱門文章

原來使用 .net 寫個 MCP Server 如此簡單

使用LM Studio輕鬆在本地端以API呼叫大語言模型(LLM)

開啟 teams 中的『會議轉錄(謄寫)』與Copilot會議記錄、摘要功能

在VS Code當中使用 Azure DevOps MCP Server

原來使用 .net 寫個 MCP Client 也如此簡單