在 Windows Phone 7 中有些功能必須透過 Task 才能達成。
Task
在 Windows Phone 中不能直接操作像是簡訊(SMS)、打電話(Phone)、收發Email及使用相機等功能,必須透過 Task 來呼叫系統的相關任務來執行上述的功能。當 Task 被呼叫使用時,本身的App會進入 tombstone 的狀態,所以記得要預做保留資料的動作。使用時必須引用的命名空間:Microsoft.Phone.Task
Task 分為兩類:一個是 Chooser (選擇器),一個是 Launcher (啟動器)。
兩者只有簡單的差別,選擇器會去選擇某個資料後傳回;啟動器則是去執行該任務,完成後就結束並回到原App。
Chooser:
- CameraCaptureTask
- EmailAddressChooserTask
- PhoneNumberChooserTask
- PhotoChooserTask
- SaveEmailAddressTask
- SavePhoneNumberTask
Launcher:
- EmailComposeTask
- PhoneCallTask
- SerachTask
- SmscomposeTask
- WebBrowserTask
- MediaPlayerLanucher
- MarketPlaceDetailTask
- MarketplaceHubTask
- MarketplaceReviewTask
- MarketPlaceSearchTask
Chooser
使用上的注意事項,在MSDN上的說明,建議將 Chooser 設為全域變數,初始化及事件註冊的的動作也建議都在 PhoneApplicationPage 的建構式 ( 在InitializeComponent() 方法之後 ) 中去完成,因為 Windows Phone 一次只會執行一支程式,當使用 Chooser 或 Launcher 時,原本的程式將會被暫停,要注意資料保存的問題。CameraCaptureTask
打開相機拍照,並取得照片。 此範例用到一個按鈕及一個 Image 控制項。按下拍照按鈕(左上圖)後,會啟動相機(右上圖),在模擬器畫面中是一片黑,按下右上角的拍照鈕,會出現拍照所取得的照片(左下圖),並且尋問是否接受此照片,若按下接受,會回傳影像 stream 給原呼叫的程式,我們將它顯示在 Image 控制項中 (右下圖)。程式碼如下:
using Microsoft.Phone.Tasks;
using System.Windows.Media.Imaging;
namespace HelloWindowsPhone
{
public partial class MainPage : PhoneApplicationPage
{
//以全域方式建立變數
CameraCaptureTask camera;
// 建構函式
public MainPage()
{
InitializeComponent();
//產生物件及註冊完成事件
camera = new CameraCaptureTask();
camera.Completed += new EventHandler<PhotoResult>(camera_completed);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
//啟動相機
camera.Show();
}
private void camera_completed(object sender, PhotoResult e)
{
//依使用者選擇做處理
if (e.TaskResult == TaskResult.OK)
{
BitmapImage bmp = new BitmapImage();
bmp.SetSource(e.ChosenPhoto);
image1.Source = bmp;
}
else
{
image1.Source = null;
}
}
}
}
EmailAddressChooserTask
取得連絡人的 Email。 此範例用到一個按鈕及一個文字欄位(左上圖)。按下 Email 按鈕,切換到連絡人清單(右上圖),點選任一連絡人後傳回此人的 Email 並顯示在文字欄位(左下圖)。程式碼如下:
namespace HelloWindowsPhone
{
public partial class MainPage : PhoneApplicationPage
{
//以全域方式建立變數
EmailAddressChooserTask email;
// 建構函式
public MainPage()
{
InitializeComponent();
//產生物件及註冊完成事件
email = new EmailAddressChooserTask();
email.Completed += new EventHandler<EmailResult>(email_Completed);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
email.Show();
}
private void email_Completed(object sender, EmailResult e)
{
if (e.TaskResult == TaskResult.OK)
{
textBlock1.Text = e.Email;
}
}
}
}
PhoneNumberChooserTask
取得連絡人的電話號碼。 此範例和取 Email 相同。按下 Phone 按鈕後切換到連絡人清單,取回選擇的連絡人的電話號碼(如上圖)。程式碼如下:
namespace HelloWindowsPhone
{
public partial class MainPage : PhoneApplicationPage
{
//以全域方式建立變數
PhoneNumberChooserTask phoneNumber;
// 建構函式
public MainPage()
{
InitializeComponent();
//產生物件及註冊完成事件
phoneNumber = new PhoneNumberChooserTask();
phoneNumber.Completed += new EventHandler<PhoneNumberResult>(phoneNumber_Completed);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
phoneNumber.Show();
}
private void phoneNumber_Completed(object sender, PhoneNumberResult e)
{
if (e.TaskResult == TaskResult.OK)
{
textBlock1.Text = e.PhoneNumber;
}
}
}
}
PhotoChooserTask
取得手機中的圖片。 此範例用到一個按鈕及 Image 控制項(左上圖)。按下 Photo 按鈕切換到相簿(右上圖),選擇一個相簿進入後列出全部相片(左下圖),選擇其中一張相片後傳回(右下圖)。另外,如下圖左,你可以設定是否讓相機成為圖片來源,當你啟用此功能時,會在 Application Bar 中出現相機的按鈕,使用相機拍照所得到的相片。
你還可以對取得的圖片做裁切,當你設定圖片的尺寸時,在選取圖片的同時會出現一個裁切框,按下下方的打勾鈕後,傳回裁切過的圖片(下圖右)。 程式碼如下:
namespace HelloWindowsPhone
{
public partial class MainPage : PhoneApplicationPage
{
//以全域方式建立變數
PhotoChooserTask photo;
// 建構函式
public MainPage()
{
InitializeComponent();
//產生物件及註冊完成事件
photo = new PhotoChooserTask();
photo.Completed += new EventHandler<PhotoResult>(photo_Completed);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
//若要裁切相片,可以設定裁切後的尺寸
//photo.PixelHeight = 200;
//photo.PixelWidth = 480;
//若要使用相機,可以設定出現拍照的按鈕(位於 Application Bar)
//photo.ShowCamera = true;
photo.Show();
}
private void photo_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
BitmapImage bmpSource = new BitmapImage();
bmpSource.SetSource(e.ChosenPhoto);
image1.Source = bmpSource;
}
else
{
image1.Source = null;
}
}
}
}
SaveEmailAddressTask、SavePhoneNumberTask
儲存 Email 及電話號碼。 此範例一次介紹儲存 Email 及電話號碼,兩者使用方法相同,只是類別不同。當按下按鈕時,會將文字框中的 Email 或電話號碼送給相關的 Task 而切換到連絡人清單,可以新增或選擇原有的連絡人即可儲存。namespace HelloWindowsPhone
{
public partial class MainPage : PhoneApplicationPage
{
//以全域方式建立變數
SaveEmailAddressTask saveEmail;
SavePhoneNumberTask savePhone;
// 建構函式
public MainPage()
{
InitializeComponent();
//產生物件及註冊完成事件
saveEmail = new SaveEmailAddressTask();
saveEmail.Completed += new EventHandler<TaskEventArgs>(saveEmail_Completed);
savePhone = new SavePhoneNumberTask();
savePhone.Completed += new EventHandler<TaskEventArgs>(savePhone_Completed);
}
private void saveEmail_Completed(object sender, TaskEventArgs e)
{
}
private void savePhone_Completed(object sender, TaskEventArgs e)
{
}
private void btnSaveEmail_Click(object sender, RoutedEventArgs e)
{
saveEmail.Email = txtEmail.Text;
saveEmail.Show();
}
private void btnSavePhoneNumber_Click(object sender, RoutedEventArgs e)
{
savePhone.PhoneNumber = txtPhoneNumber.Text;
savePhone.Show();
}
}
}
Launcher
EmailComposeTask
利用 EmailComposeTask 幫我們寄信。下圖右是寄送結果,在模擬器是無法傳送的。 程式碼:private void button1_Click(object sender, RoutedEventArgs e)
{
EmailComposeTask email = new EmailComposeTask();
email.To = txtTo.Text;
email.Subject = txtSubject.Text;
email.Body = txtBody.Text;
email.Show();
}
PhoneCallTask
打電話啦~~左圖可以輸入電話號碼,中圖可讓使用者選擇打或不打,右圖則是撥打的畫面。 程式碼:private void button1_Click(object sender, RoutedEventArgs e)
{
PhoneCallTask call = new PhoneCallTask();
call.DisplayName = "Tonycube";
call.PhoneNumber = textBox1.Text;
call.Show();
}
SerachTask
搜尋。程式碼如下:SearchTask search = new SearchTask();
search.SearchQuery = textBox1.Text;
search.Show();
SmscomposeTask
發簡訊。程式碼如下:SmsComposeTask sms = new SmsComposeTask();
sms.To = txtPhoneNumber.Text;
sms.Body = txtMessage.Text;
sms.Show();
WebBrowserTask
使用瀏覽器開啟某網址。程式碼如下:WebBrowserTask web = new WebBrowserTask();
web.Uri = new Uri(txtUrl.Text, UriKind.Absolute);
web.Show();
MediaPlayerLanucher
影片播放。程式碼如下:MediaPlayerLauncher player = new MediaPlayerLauncher();
//檔案位置
player.Location = MediaLocationType.Install;
//顯示全部的控制鈕
player.Controls = MediaPlaybackControls.All;
//只出現停止按鈕及暫停按鈕
//mpl.Controls = MediaPlaybackControls.Pause | MediaPlaybackControls.Stop;
//指定播放的檔案
player.Media = new Uri(@"Media\movie.wmv", UriKind.Relative);
player.Show();
Location 屬性:
檔案的存放區域。有 3 個值:
- MediaLocationType.Install:位於安裝目錄中,即封裝於 xap 檔內。
- MediaLocationType.Data:位於隔離儲存區中。通常為從網路下載的檔案。
- MediaLocationType.None:沒作用。呼叫 show() 方法後,直接丟出 FileNotFroundException 的例外。
要播放的檔案。
Controls 屬性:
控制按鈕。
MarketPlaceDetailTask
啟動內建的 MarketPlace 應用程式。程式碼如下:MarketplaceDetailTask market = new MarketplaceDetailTask();
//只能設定為Applcations
market.ContentType = MarketplaceContentType.Applications;
//當沒有指定值則會以目前的應用程式為目標
//如果格式檢查不符合 GUID 的格式則會丟出 exception
//market.ContentIdentifier = txtID.Text;
market.Show();
MarketplaceHubTask
不透過內建應用程式,直接開啟市集。程式碼如下:MarketplaceHubTask market = new MarketplaceHubTask();
market.ContentType = MarketplaceContentType.Applications;
//mht.ContentType = MarketplaceContentType.Music;
market.Show();
MarketplaceReviewTask
讓使用者直接為您的應用程式做評分、建議等動作。在啟動後會直接開啟 Marketplace 的頁面。程式碼如下:MarketplaceReviewTask market = new MarketplaceReviewTask();
market.Show();
MarketPlaceSearchTask
搜尋 Marketplace 上的應用程式或音樂。
本文網址:https://blog.tonycube.com/2012/06/windows-phone-8-task.html
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
由 Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀
我要留言
留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。