使用相機需要引用如下命名空間
using Microsoft.Phone.Tasks;
在這個案例中我們還用到了BitmapImage類,所以我們需要引用命名空間
using System.Windows.Media.Imaging;
如下
MainPage.xaml檔案在初始化的基礎上添加了兩個元素
<TextBlock x:Name="txtName" Text="啟動相機" Grid.Row="1" ></TextBlock>
<Image x:Name="img" Grid.Row="1" Margin="12,10,12,0" ></Image>
程式碼後置檔案
using System;using System.Collections.Generic;using System.Linq;using System.Net;using System.Windows;using System.Windows.Controls;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Animation;using System.Windows.Shapes;using Microsoft.Phone.Controls;//引用using System.Windows.Media.Imaging;using Microsoft.Phone.Tasks;namespace CameraShoot{ public partial class MainPage : PhoneApplicationPage { //相機捕獲任務執行個體 CameraCaptureTask cameraCT = new CameraCaptureTask(); // 建構函式 public MainPage() { InitializeComponent(); //手機拍照功能完成後調用 cameraCT.Completed += new EventHandler<PhotoResult>(cameraCT_Completed); } //重寫觸控螢幕事件 protected override void OnManipulationStarted(ManipulationStartedEventArgs e) { //知識點① if (e.OriginalSource==txtName) { //調用相機 cameraCT.Show(); } //知識點② //觸摸事件完成 e.Complete(); //知識點③ //不在向父元素傳遞 e.Handled = true; //知識點④ base.OnManipulationStarted(e); } //完成 void cameraCT_Completed(object sender, PhotoResult e) { if (e.TaskResult==TaskResult.OK) { BitmapImage bmp = new BitmapImage(); //知識點⑤ //擷取包含檔案流的和Source不同 bmp.SetSource(e.ChosenPhoto); //設定圖片源 img.Source = bmp; txtName.Text = e.OriginalFileName; } } }}
CameraCaptureTask 派生自ChooserBase
其中CameraCaptureTask,有兩個比較實用的方法,也就是我們這裡用到的
Show; 調用相機功能
Completed ;相機拍攝完成之後可被調用
知識點①:該事件中的e是指,通過該事件傳遞過來的參數,所以我們可以從中擷取一些資訊,屬性OriginalSource表示產生該事件的元素(在windows phone 中都稱之為元素而非控制項);
知識點②:這裡調用了Completed方法,加上該方法之後,系統就不會處理相應的路由事件了,這裡是指重寫的OnManipulationStarted事件 ;
知識點③: e.Handled = true; 該屬性設定表示該路由事件已經處理完畢,不需要在向視覺化樹狀結構的上一層傳遞;
知識點④:調用本方法的基類方法,雖然在這裡重寫了基類方法,但是不可避免的在基類完成的基礎性操作,重寫沒有完成,這樣操作會出現一些錯誤
知識點⑤:利用SetSource設定的源一定是Stream流,wp支援png和jpeg格式
這些都是在模擬器上的的操作,如果在真機上測試,請在測試前關閉ZUNE,也可移步
http://www.cnblogs.com/fwind/archive/2011/11/28/2265890.html
總結:使用相機是直接調用CameraCaptureTask類的show方法,這樣相機就開啟了,直到圖片產生,再調用Completed方法,在Completed方法中獲得 PhotoResult中該圖片的stream 並作為位元影像的源,並設定image的源;當前圖片的檔案名稱也就是PhotoResult的屬性OriginalFileName,得到的檔案名稱為該圖片的完整路徑