使用相機需要引用如下命名空間
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>
代碼隐藏檔案
View Code
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;
//引用
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;
}
}
<a href="http://msdn.microsoft.com/en-us/library/microsoft.phone.tasks.cameracapturetask%28v=VS.92%29.aspx">CameraCaptureTask 派生自ChooserBase</a>
其中CameraCaptureTask,有兩個比較實用的方法,也就是我們這裡用到的
Show; 調用相機功能
Completed ;相機拍攝完成之後可被調用
知識點①:該事件中的e是指,通過該事件傳遞過來的參數,是以我們可以從中擷取一些資訊,屬性OriginalSource表示産生該事件的元素(在windows phone 中都稱之為元素而非控件);
知識點②:這裡調用了Completed方法,加上該方法之後,系統就不會處理相應的路由事件了,這裡是指重寫的OnManipulationStarted事件 ;
知識點③: e.Handled = true; 該屬性設定表示該路由事件已經處理完畢,不需要在向可視化樹的上一層傳遞;
知識點④:調用本方法的基類方法,雖然在這裡重寫了基類方法,但是不可避免的在基類完成的基礎性操作,重寫沒有完成,這樣操作會出現一些錯誤
知識點⑤:利用SetSource設定的源一定是Stream流,wp支援png和jpeg格式
總結:使用相機是直接調用CameraCaptureTask類的show方法,這樣相機就打開了,直到圖檔生成,再調用Completed方法,在Completed方法中獲得 PhotoResult中該圖檔的stream 并作為位圖的源,并設定image的源;目前圖檔的檔案名也就是PhotoResult的屬性OriginalFileName,得到的檔案名為該圖檔的完整路徑