Windows Phone開發之路(13) 觸摸

來源:互聯網
上載者:User

  Silverlight支援兩種不同的編程介面來支援多點觸摸,可以簡單地分類為底層介面和高層介面。其中底層介面是基於靜態Touch.FrameReported事件的。高層介面由UIElement類中定義的3個事件組成:ManipulationStarted,ManipulationDeta和ManipulationCompleted,這些事件統稱為Manipulation事件,它把多個手指的互動操作合并成移動和縮放兩個因子。下面分別從使用底層介面和高層介面兩個方面進行總結。

使用底層觸摸介面

  要使用底層觸摸介面,需要為靜態Touch.FrameReported事件註冊一個事件處理常式。下面樣本對此進行了示範,當單擊TextBlock測試地區時,文本隨機變成另一種顏色,當單擊TextBlock測試地區以外地區時文本又變成原始的顏色。
  XAML代碼:

<Grid x:Name="LayoutRoot" Background="Transparent">
<TextBlock Name="txtblk"
Text="Hello,Windows Phone 7!"
Padding="0,34"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Grid>

  C#代碼:

public partial class MainPage : PhoneApplicationPage
{
Random rand = new Random();
Brush originalBrush;

// 建構函式
public MainPage()
{
InitializeComponent();

originalBrush = txtblk.Foreground;//擷取txtblk的畫刷,其中Foreground屬性為Brush類型,預設值為SolidColorBrush,其Color值為 Black
Touch.FrameReported += OnTouchFrameReported;//註冊事件處理常式
}

protected void OnTouchFrameReported(object sender, TouchFrameEventArgs e)
{
TouchPoint primaryTouchPoint = e.GetPrimaryTouchPoint(null);//調用TouchFrameEventArgs對象的方法,擷取觸摸點與螢幕左上方的相對位置
if (primaryTouchPoint != null && primaryTouchPoint.Action == TouchAction.Down)//Action為Down的主觸控點
{
if (primaryTouchPoint.TouchDevice.DirectlyOver == txtblk)//手指觸控的是最頂層元素
{
txtblk.Foreground = new SolidColorBrush(Color.FromArgb(255, (byte)rand.Next(256), (byte)rand.Next(256), (byte)rand.Next(256)));//指定一個隨機顏色
}
else
{
txtblk.Foreground = originalBrush;//將txtblk的Foreground設回原始的畫刷
}
}
}
}

  效果

    
     單擊TextBlock地區              單擊TextBlock以外地區

使用高層觸摸介面

  Silverlight中的高層觸摸介面包含了三個事件:ManipulationStarted,ManipulationDeta和ManipulationCompleted。Touch.FrameReported是為整個應用程式傳遞觸摸資訊的,而Manipulation事件是基於單個元素的,所以可以把ManipulationStarted事件處理常式註冊到TextBlock上。下面樣本使用高層觸摸介面對前面的例子進行了重寫。

  XAML代碼:

<Grid x:Name="LayoutRoot" Background="Transparent">
<TextBlock Name="txtblk"
Text="Hello,Windows Phone 7!"
Padding="0,34"
HorizontalAlignment="Center"
VerticalAlignment="Center"
ManipulationStarted="txtblk_ManipulationStarted"/>
</Grid>

  C#代碼:

public partial class MainPage : PhoneApplicationPage
{
Random rand = new Random();
Brush originalBrush;

// 建構函式
public MainPage()
{
InitializeComponent();

originalBrush = txtblk.Foreground;//擷取原始畫刷
}

private void txtblk_ManipulationStarted(object sender, ManipulationStartedEventArgs e)//處理註冊事件處理常式
{
txtblk.Foreground = new SolidColorBrush(Color.FromArgb(255, (byte)rand.Next(256), (byte)rand.Next(256), (byte)rand.Next(256)));//指定一個隨機顏色
e.Complete();//告訴系統不需要再處理該手指所涉及的Manipulation事件了
e.Handled = true;//表示該事件現已處理,不需要再進一步的傳遞到視覺化樹狀結構的上層了。涉及到路由事件的知識
}

protected override void OnManipulationStarted(ManipulationStartedEventArgs e)//重寫基類虛方法
{
txtblk.Foreground = originalBrush;//設回原始的畫刷

e.Complete();
base.OnManipulationStarted(e);//base關鍵字表示調用基類的方法
}
}
路由事件

  Manipulation事件來源自於使用者觸摸的可用頂層元素。但是如果該頂層元素不關心該事件的話,該事件會轉寄到該元素的父元素去,如此,一直轉寄到視覺化樹狀結構的最進階PhoneApplicationFrame元素為止。沿途的任何元素都可以擷取這個輸入事件並進行處理,也能阻止事件往樹的高層繼續傳遞。

  這就是可以在MainPage中重寫OnManipulationStarted方法使TextBlock得到Manipulation事件的原因。
   

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.