wp7學習筆記

l_serein發表於2012-11-15

Emulator中文叫模擬器,是精確地在一種環境下模擬另一種環境下的執行方式。其目的是完全模擬。Simulator中文叫模擬,是通過某種手段來模擬某些東西,不一定要完全正確的原理,追求的只是儘可能的相像。所以XDE是WP7的Emulator,是一個WP7的虛擬機器,我準備寫一個XP下開發WP7程式的Simulator。

1、XBox和WP7之間的遊戲移植很方便。
2、WP7程式不能執行在後臺,不支援多工。
3、C#是唯一支援的開發語言,不能使用native code,不能PInvoke
4、WP7使用Zune連線電腦,不再支援通過ActiveSync的聯絡人的同步,而是通過網路同步聯絡人。
5、使用高階Task的時候必須對模擬器進行Unlock,因為沒有Unlock的話模擬器的內容很少。
6、WP7首頁上的方框叫Tile,
7、一個程式只能有一個Frame,是所有頁面的容器,為SystemTray和ApplicationBar預留空間
8、顯示的方向通過Orientation屬性來設定:Portrait是豎向,Landscape是橫向;SupportedOrientations屬性設定支援的方向(預設值是Portrait,也就是隻支援豎向。如果設定為PortraitOrLandscape則在轉向的時候介面會自動調整);當轉向的時候OrientationChanged事件會被觸發。
9、WP7中頁面的跳轉不再是Show這種方式,而是頁面Navigation跳轉,類似於網頁:this.NavigationService.Navigate(new Uri("/Page1.xaml",UriKind.Relative));this.NavigationService.GoBack();this.NavigationService.GoForward();
跳轉的時候還可以填值:this.NavigationService.Navigate(new Uri("/Page1.xaml?name=tome",UriKind.Relative));
頁面中獲取值:this.NavigationContext.QueryString["name"];

可以override OnNavigatedFrom、OnNavigatedTo、OnNavigatingFrom幾個方法進行導航的響應。

在普通SL中執行這個的話需要使用“導航Silverlight”模板,參考:http://www.cnblogs.com/steven_gsj/archive/2010/04/24/1719265.html 如果導航失敗的話是設定UriMapper的原因,清空即可。NavigationService在Page中才有。

10、shell:SystemTray.IsVisiable屬性控制SystemTray可見性
11、ApplicationBar就是選單欄。ApplicationBarIconButton屬性IconUrl、Text,圖示要求是48*48png圖,前景色一般是白色,微軟在C:\Program Files\Microsoft SDKs\Windows Phone\v7.0\Icons中提供了一些常用的圖示.ApplicationBarIconButton最多隻能新增4個,引進圖片的時候一定要注意在VS選擇圖片的屬性“BuildAction=Content”、“如果較新則複製”。MenuItems也是放到ApplicationBar中的,MenuItems沒有圖片、沒有二級選單。

12、Style="{StaticResource PhoneTextNormalStyle}"引用的是資源。程式碼中用Application.Current.Resources["name"]來載入資源。儘量不要使用自己的顏色,而是引用系統資源中定義的顏色,這個和CSS原理類似。預設系統資源在C:\Program Files\Microsoft SDKs\Windows Phone\v7.0\Design\ThemeResources.xaml下

13、獨立儲存(IsolatedStorage)只有本程式可以訪問該區域,安全性高,預設大小為2GB,不能長期儲存資料。位於System.IO.IsolatedStorage名稱空間下,solatedStorageFile、solatedStorageFileStream兩個類。
建立IsolatedStorageFile的方法IsolatedStorageFile.GetUserStoreForApplication(),IsolatedStorageFile類有CreateDirectory()、DirectoryExists()等很多有用的方法。
建立讀寫流的方法:IsolatedStorageFileStream stream = new IsolatedStorageFileStream("3.txt", FileMode.OpenOrCreate,
                IsolatedStorageFile.GetUserStoreForApplication())

14、在Tile中的圖片是在專案的屬性中修改的。
15、如果採用Grid佈局,相當於ColumnDefinitions和RowDefinitions將介面劃分成了網格,然後元素通過Grid.Column、Grid.Row屬性來設定它顯示在哪個格子中。
16、Canvas佈局中程式碼修改元素位置的方法Canvas.SetLeft(img1,30);
17、Popup容器可以將內部的內容放到頂層顯示,IsOpen屬性用來標誌是否顯示。因為SL中頁面顯示一般是用導航的,但是如果想實現WinForm中對話方塊的效果就可以用Popup
18、ScrollView包含的內容會可以滾動。
19、HyperlinkButton是一個用於本地、Web的超連結。NavigationUri指向地址,如果指向的是Web地址,則必須設定Target屬性。HyperlinkButton可以給Background屬性設定ImageBrush來顯示圖片超連結。
20、用模擬器的時候按Pause鍵就可以用電腦鍵盤輸入了。
21、TextBox設定InputScope屬性可以讓軟鍵盤換不同的佈局,設定為TelephoneNumber會顯示為數字鍵盤,設定為Url鍵盤會顯示“.com”按鈕。所有可選值位於InputScopeNameValue這個列舉中。
22、Image控制元件只支援png和jpg圖片,可以通過Source屬性顯示本地或者網路影像,網路圖片直接填路徑就行了,不用通過程式碼先下載。通過程式碼載入this.img1.Source = new BitmapImage(new Uri("Desert.jpg",UriKind.Reltive));this.img1.Source = new BitmapImage(new Uri("http://www.baidu.com/Desert.jpg",UriKind.Absolute));
23、MediaElement能夠播放本地或者網路上的多媒體,支援WAV、MP3等,支援mms、rtspt、rtsp等流媒體協議。主要屬性:IsMuted,是否靜音;Stretch,填充方式;AutoPlay:自動播放。事件:MediaOpend、MediaEnded、MediaFailed。
24、推薦使用DispatcherTimer來做定時。因為如果用Timer的話在Timer的Elapsed中訪問UI的話需要同步到UI執行緒執行,而DispatcherTimer是執行在Dispatcher上的,所以訪問UI的時候不需要委託到UI執行緒執行。
25、Thumb是一個可拖動的控制元件,簡化了拖動的開發,Thumb是預設沒有再ToolBox中的,需要ChooseItem選進來。通過DragCompleted、DragDelta、DragStarted事件來響應。
當一個Thumb拖動的時候跟著滑鼠走:
            <Thumb Height="87" HorizontalAlignment="Left" Margin="89,163,0,0" Name="thumb1" VerticalAlignment="Top" Width="91" DragCompleted="thumb1_DragCompleted" DragDelta="thumb1_DragDelta">
                <Thumb.RenderTransform>
                    <TranslateTransform x:Name="tr"></TranslateTransform>
                </Thumb.RenderTransform>
            </Thumb>
        private void thumb1_DragDelta(object sender, System.Windows.Controls.Primitives.DragDeltaEventArgs e)
        {
            tr.X = tr.X+e.HorizontalChange;
            tr.Y = tr.Y+e.VerticalChange;
        }
        在Silverlight中一般不直接修改元素的座標、大小,在需要修改元素的座標、大小的時候一般使用Transform來做。
26、ListBox通過ItemTemplate來定製外觀,Template內部用Text="{Binding Text}"進行繫結
繫結的物件的類要是public的,否則會繫結失敗
            <ListBox Height="361" HorizontalAlignment="Left" Margin="60,165,0,0" Name="listBox1" VerticalAlignment="Top" Width="311" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal">
                            <Image Width="100" Height="100" Source="{Binding Avatar}"/>                            
                            <StackPanel Orientation="Vertical">
                                <TextBlock Text="{Binding Name}"/>
                                <TextBlock Text="{Binding Age}"/>
                            </StackPanel>
                        </StackPanel>                        
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public ImageSource Avatar { get; set; }
    }

            List<Person> list = new List<Person>();
            list.Add(new Person { Name="Tom",Age=20,Avatar=new BitmapImage(new Uri("Images/1.jpg",UriKind.Relative))});
            list.Add(new Person { Name = "Jim", Age = 22, Avatar = new BitmapImage(new Uri("Images/2.jpg", UriKind.Relative)) });
            listBox1.ItemsSource = list;          

圖片的路徑不能以“/”開頭,也就是不能"/Images/1.jpg"。

ImgSource屬性是ImageSource型別,ImageSource的一個子類是BitmapImage
27、InkPresenter可以產生手寫效果。事件:LostMouseCapture、MouseLeftButtonDown、MouseMove。
滑鼠畫圖的典型程式碼:
        private Stroke stroke;
        private void inkPresenter1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {            
            inkPresenter1.CaptureMouse();
            stroke = new Stroke();
            stroke.DrawingAttributes.Color = Colors.Red;
            inkPresenter1.Strokes.Add(stroke);
        }

        private void inkPresenter1_MouseMove(object sender, MouseEventArgs e)
        {
            stroke.StylusPoints.Add(e.StylusDevice.GetStylusPoints(inkPresenter1));
        }
28、WP7中可以使用BMSL來使用BingMaps
29、微軟釋出了Silverlight控制元件之外的Silverlight Toolkit,有wp7的版本。提供了額外的控制元件:AutoCompleteBox、ContextMenu、DatePicker、TimePicker、LongListSelector、ListPicker、ToggleSwitch(很好看的開關)、WrapPanel等控制元件
1)ContextMenu控制元件提供了上下文選單,長按螢幕彈出,因為手機中沒有右鍵。ContextMenu不能用在容器控制元件中
            <TextBox Height="72" HorizontalAlignment="Left" Margin="17,109,0,0" Name="textBox1" Text="TextBox" VerticalAlignment="Top" Width="384">
                <toolkit:ContextMenuService.ContextMenu>
                    <toolkit:ContextMenu>
                        <toolkit:MenuItem Header="複製"/>
                        <toolkit:Separator/>
                        <toolkit:MenuItem>
                            <toolkit:MenuItem.Header>
                                <Image Width="30" Height="30" Source="ApplicationIcon.png"/>
                            </toolkit:MenuItem.Header>
                        </toolkit:MenuItem>
                    </toolkit:ContextMenu>
                </toolkit:ContextMenuService.ContextMenu>
            </TextBox>
ContextMenu還可以設定Margin屬性,這時候Margin屬性用來改變選單相對於控制元件的位置。
2)WrapPanel會將放到其中的控制元件按照從左到右、從上到下的順序依次排列。
3)DatePicker、TimePicker是非常易用的日期、時間選擇器,而且可以通過ValueStringFormat來修改顯示格式,語法就是DateTime.ToString的格式語法。
4)ListPicker和ListBox的不同在於,如果為FullMode那麼當點選ListPicker的時候會彈出一個全屏視窗來選擇,用起來更方便。
5)LongListSelector用來對資料進行快速的分類定位,非常方便,用起來比較複雜,看例子就行。

30、Panorama控制元件是一個全景檢視控制元件,像一個視窗,能夠檢視內容的一部分。全景檢視由Background、Title、Items組成。可以自己加這些控制元件,也可以用專案嚮導中的“WindowsPhone Panorama Application”快速建立一個完整的Panorama控制元件專案,用來學習很方便。用法看向導生成的程式碼即可。
31、Pivot控制元件是一個豎向滾動的控制元件。
32、WP7中可以使用DeepZoom技術。
wp7社群 http://social.msdn.microsoft.com/Forums/en-US/windowsphone7series
33、Blend的使用:
1)向左下角傾斜的按鈕是漸變工具,可以設定控制元件的漸變。漸變有線性漸變、徑向漸變兩種。
2)筆刷變換工具是對控制元件的Brush進行變形的工具,和控制元件變形不一樣。
3)轉換(Transform)中的RenderTransfer可以用來實現旋轉、縮放、位移等效果。
4)可以選中一個控制元件然後再在控制元件裡新增子控制元件
5)新建時間線、可以選擇不同的關鍵幀,在關鍵幀處設定控制元件屬性變化的目標值。
6)可以將Brush等轉換為資源,這樣可以服用,類似於CSS。可以設定一個畫刷,然後點選旁邊的小方塊圖示,選擇“轉換為新資源”,儲存的時候可以儲存為UserControl中還是單獨的檔案中,類似於在htm中宣告樣式和單獨的css中宣告樣式。一旦轉換為資源,就可以在“畫筆資源”皮膚中選擇了。

45、SL控制元件包含Parts、States Model兩部分,Parts就是子控制元件。StatesModel包含:Visual States(控制元件在不同狀態下顯示的效果)、Visual State Groups(為有互斥效果的控制元件提供的,相同的Visual State Groups是互斥的,不同的Visual State Groups是不互斥的)、Visual Transition(視覺狀態轉換時切換動畫效果)。
1)快速設定控制元件的Visual State的方法:繪製Ellipse等圖形,然後點選右鍵選擇“構成控制元件(Make Into Control)”,然後選擇要修改的控制元件即可。假設選擇的是Button控制元件,這時候編輯器就進入了按鈕的Templates編輯器,這時候設計器中的修改都是反映到Button的Template中的,要想退出需要點選設計器左上角的“[Button]”,想再次繼續則需要選中按鈕,然後點選設計器左上角的“Template”,也可以點選控制元件,右鍵選擇“編輯模板”→“Editi Current”。
2)如果設定了“構成控制元件(Make Into Control)”,則預設所有狀態都是一個樣子,點選按鈕將不會有效果,可以修改不同的狀態的樣子。編輯控制元件的Template進入Template編輯模式,選擇“狀態(States)”皮膚中的“Pressed”,調整控制元件的大小或者顏色,這樣就可以設定按鈕按下的樣式了。
3)除了可以用“構成控制元件(Make Into Control)”修改控制元件之外,也可以在控制元件上點選右鍵,選擇“編輯模板(Edit Template)”→“編輯副本(Edit Copy)”來修改Template。
4)應用已有樣式模板的方法,點選控制元件、右鍵“編輯模板”→“引用資源”
5)控制元件之間狀態轉換的時候是瞬間切換的,如果想要動畫轉換效果,則需要在狀態上點選“新增過渡”按鈕新增過渡效果,需要設定過渡時間,注意Normal和Pressed之間一般不能直接轉換,因為還隔著一個MouseOver呢。
6)可以用自定義Visual State技術來自定義ProgressBar,因為可以在State內部也是用動畫,這樣就可以實現Indeterminate狀態下一個心臟跳來跳去的效果或者一個星星一閃一閃的效果。

46、WP7沒有提供直接操作SMS、Phone、Email、Camera等的API,需要通過Task來執行,因此無法批量操作、免介面操作。當Task啟動後,自己的應用程式就會被終止,通過Tombstone機制再次喚起自己的程式,並需要維護相關的狀態。
47、Task:
1)PhoneCallTask用來撥號,主要兩個屬性:DisplayName、PhoneNumber,呼叫Show方法即可啟動。
2)SmsComposeTask用來開啟系統SMS程式,並且設定所要發的簡訊內容和傳送人,可以傳送彩信,但是隻能發圖片和攝像頭拍照,不能傳送聲音和視訊。Body、To兩個屬性。
3)SavePhoneNumberTask用來呼叫聯絡人程式,將電話號碼儲存到選中的聯絡人或者新建聯絡人。屬性:PhoneNumber,事件Completed,無法設定聯絡人的姓名,必須使用者手工填寫。
4)PhoneNumberChooserTask用來開啟聯絡人介面,選擇一個聯絡人的號碼。在Completed事件中獲得選擇的號碼。
5)EmailComposeTask用來發郵件。EmailAddressChooserTask用來選擇郵件地址。SaveEmailAddressTask。
6)PhotoChooserTask用來呼叫圖片程式選擇圖片,並可以進行裁切。ShowCamera用來控制是否顯示拍照程式,PixelWidth、PixelHeight屬性設定裁切的大小,Completed事件用來監聽選擇完成事件。Completed事件中e.ChosenPhoto獲得選中影像的流。
BitmapImage img = new BitmapImage();
img.SetSource(e.ChosenPhoto);
image1.Source = img;

需要注意PhotoChooserTask不能宣告為區域性變數,必須宣告為類成員。因為啟動照相機以後應用就被結束了,因此如果在按鈕Click事件中如下寫:
PhotoChooserTask task = new PhotoChooserTask();
task.Completed += new EventHandler<PhotoResult>(task_Completed);
task.PixelHeight = 100;
task.PixelWidth = 100;
task.ShowCamera = true;            
task.Show();

task_Completed事件不會正確觸發的,因為再次回來已經不是上次引用程式的例項了,因此需要如下編寫:
PhotoChooserTask task = new PhotoChooserTask();
 public MainPage()
        {
            InitializeComponent();
            task.Completed += new EventHandler<PhotoResult>(task_Completed);
        }
 private void Button_Click(object sender, RoutedEventArgs e)
        {
            task.PixelHeight = 100;
            task.PixelWidth = 100;
            task.ShowCamera = true;
            
            task.Show();
        }  
也就是把註冊Completed監聽放到建構函式中,這樣程式重啟啟動以後如果是從照相機返回的事件就會被觸發。
注:這是舊SDK的Bug,新SDK已經沒有這個問題。
 
7)CameraCaptureTask用於啟動拍照程式,同樣響應Completed事件。
8)MediaPlayerLauncher用來呼叫系統的MediaPlayer程式播放本地或者Web的媒體。模擬器上無法播放Video。
9)WebBrowserTask用來在瀏覽器中開啟URL,只要設定URL屬性即可。
10)SearchTask用來啟動搜尋程式,設定SearchQuery屬性。

48、WP7應用程式只支援在前臺執行,如果一個程式在你的程式正在執行的時候啟動,程式收到一個將要被終止的事件通知。在程式關閉狀態下,可以通過WebService來向程式傳送資訊以及更新程式狀態,這叫PushNotification。
49、Tombstone課執行模式:Tombstoning、PageState、ApplicationState、PersistentData、TransientState。Tombstoning、TransientState下模擬多工,在Tombstone模式下,應用被作業系統終止,就需要儲存TransientState,以便於應用程式復活後恢復應用原狀態。應用程式Lifecycle包括Launching、Running、Closing、Deactivating、Activating這五種執行狀態,在App.xaml.cs中影響這些事件。Deactivating、Activating就是Tombstone下的執行態。通過PhoneApplicationService來儲存狀態資訊。
可以在Page中override OnNavigatedFrom、OnNavigatedTo方法來儲存、恢復狀態。
實現儲存文字框中使用者正在輸入的值的程式碼:
protected override OnNavigatedFrom(e)
{
    PhoneApplicationService.Current.State["Test"] = textbox1.Text;
    base.OnNavigatedFrom(e);
}

protected override OnNavigatedTo(e)
{
    if(PhoneApplicationService.Current.State.ContainsKey("Test"))
    {
        textbox1.Text = PhoneApplicationService.Current.State["Test"] as string;
    }
    base.OnNavigatedTo(e);
}

50、PushNotification的幾個概念:TileNotification可以改變QuickLauchArea內的圖示內容(圖片、文字等)的方式,需要程式被Pin to Start。ToastNotification在螢幕的提示欄中顯示內容,點選提示欄可以開啟應用程式。RawNotification可以用Http方式來接收通知,不可見,以後臺方式傳送通知。WP7上只能有15個PushNotification,如果多個程式都有PushNotification能力,則有的程式可能執行不正常。詳細看視訊。
51、Microsoft.Phone.Info.UserExtendedProperties獲得使用者資訊,目前只能獲得一個用於MarketPlace的ANID。DeviceExtendedProperties用來獲取裝置資訊,可以取道的資訊如下:http://msdn.microsoft.com/en-us/library/ff941122(v=vs.92).aspx

52、Microsoft.Devices.Sensors.Accelerometer可以獲取感測器資訊。主要用於遊戲開發。todo:開發一個重力感測器模擬器。
Accelerometer am = new Accelerometer();
Accelerometer.ReadingChanged+=....;
am.Start();
am.Stop();

53、System.Device.Location名稱空間下有獲得定位資料的類。
watcher = new GeoCoordinateWatercher(GeoPositionAccuracy.Default);
watcher.MovementThreshold=35;
watcher.PositionChanged+=....

54、Microsoft.Devices.Radio下的FMRadio類是收音機裝置。因為只有一個收音機,因此是單件模式。todo:作品,帶SNS功能的網路收音機,能顯示這個頻率的電臺名。能聽友線上交流。
FMRadio radio = FMRadio.Instance;
radio.CurrentRegion = RadioRegion.Europe;
radio.Frequency = 100.5;
radio.PowerMode = RadioPowerMode.On;

55、Microsoft.Devices下的VibrateController可以控制振動器。
VibrateController vc = VibrateController.Default;
vc.Start(TimeSpan.FromMilliseconds(100));//設定震動時間。
vc.Stop()

56、可以用Reactive Extension來實現模擬裝置資料(重力、位置等),參考WebCast20101214am_裝置開發.zip
57、XNA是基於Managed DirectX的遊戲開發環境。
58、即使不開發遊戲,也可以使用XNA中的一些類。在WP7中使用XNA的時候需要使用定時器定時的執行FrameworkDispatcher.Update()以驅動XNA,否則可能會報錯,一般如下呼叫:
 DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(50);
            timer.Tick += (sender, e) => { FrameworkDispatcher.Update(); };
            timer.Start();
            
(1)用SoundEffect來播放wav格式的音訊。
SoundEffect sound = new SoundEffect(stream.ToArray(),SampleRate,AudioChannels.Mono);
SoundEffectInstance inst = sound.CreateInstance();
inst.Play();
wav格式檔案可以以資源的形式放到程式中。

Windows Phone7或者SL中載入一個資源的方法,以載入wav檔案為例:首先將wav檔案的“Build Action”屬性設定為“Embedded Resource”,假設檔名為Speech Off.wav放到專案根目錄下:
嵌入資源的名字一般是“Assembly名字.資料夾名.檔名”,如果忘了的話可以用assembly.GetManifestResourceNames()方法獲得所有的資源名。使用string asmName = new AssemblyName(Assembly.GetExecutingAssembly().FullName).Name獲得當前Assembly的名字,不能用Assembly.GetExecutingAssembly().GetName() 方法取,因為會報錯。
string asmName = new AssemblyName(Assembly.GetExecutingAssembly().FullName).Name;
            using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(asmName+".Speech Off.wav"))
            {
                SoundEffect sound = new SoundEffect(ReadFully(stream), 48000, AudioChannels.Mono);
                SoundEffectInstance inst = sound.CreateInstance();
                inst.Play();
            }  
        public static byte[] ReadFully(Stream stream)
        {
            byte[] buffer = new byte[32768];
            using (MemoryStream ms = new MemoryStream())
            {
                while (true)
                {
                    int read = stream.Read(buffer, 0, buffer.Length);
                    if (read <= 0)
                        return ms.ToArray();
                    ms.Write(buffer, 0, read);
                }
            }
        }            
       


(2)Song類播放mp3等格式的音樂,可以播放背景音樂
Song song = Song.FromUri("MyMusic",new Uri("Media/TestMusic.mp3",UriKind.Relative));
MediaPlayer.Play(song);
MediaPlayer類功能非常豐富,提供了播放列表、進度報告、播放狀態事件等,完全可以用來做一個播放器。Song類也提供了獲得專輯、聲道等的方法。
(3)Microphone類(Microsoft.Xna.Framework.Audio)可以呼叫麥克風錄音,buffer是wav格式的,可以直接傳給SoundEffect播放
Microphone m = Microphone.Default;
m.BufferReady+=...()=>{m.GetData(buffer);};
m.Start();
m.Stop();

        private byte[] ReadAllData(Microphone m)
        {
            List<byte> list = new List<byte>();
            byte[] buffer = new byte[1024];
            int readlen;
            while ((readlen = m.GetData(buffer)) > 0)
            {
                if (readlen < buffer.Length)
                {
                    list.AddRange(buffer.Take(readlen));
                }
                else
                {
                    list.AddRange(buffer);
                }               
            }
            return list.ToArray();
        }
(4)與使用者互動的方法:手勢和觸控。位於Microsoft.Xna.Framework.Input和Microsoft.Xna.Framework.Input.TouchPanel下。
觸控狀態只有Move、Press、Release三種。
TouchCollection touchState = TouchPanel.GetState();
foreach(TouchLocation location in toucheState)
{
   
}

TouchPanel.GetState()不是阻塞的,因此要在DispatchTimer中不斷的讀取獲取觸控狀態。

手勢的程式設計:
TouchPanel.EnabledGestures = GestureType.Flick|GestureType.VerticalDrag;//設定程式要監聽的手勢型別。
定時器中不斷的讀取手勢:
if(TouchPanel.EnabledGestures!=GestureType.None&&TouchPanel.IsGestureAvailable)//只有IsGestureAvailable=true才能ReadGesture
GestureType t = TouchPanel.ReadGesture().GestureType;

59、Properties下的WMAppManifest.xml中的Capabilities節點下定義的是程式要求的訪問許可權,應該保持許可權最小。DefaultTask定義的是啟動頁面。