這兩個組件都屬於選取器,而且它們也有很多相似的地方,最明顯的上一點,它們都是用來選擇圖片。
一、CameraCaptureTask選取器。
它用於啟動照相機,當你拍下照片後,自動把照的位元組流返回給調用方應用程式。前文說過,啟動器和選擇的使用方法和步驟都是一樣的。對於CameraCaptureTask組件也如此,不過注意的一點是,處理Completed事件時一定要記住,儘可能的使用頁面類的Dispatcher.BeginInvoke方法,因為非同步回調直接存取UI元素是不安全的,極有可能會引發異常,但我不是說絕對。
<Grid><br /> <Grid.RowDefinitions><br /> <RowDefinition Height="*"/><br /> <RowDefinition Height="auto"/><br /> </Grid.RowDefinitions><br /> <Image x:Name="img" Grid.Row="0" Stretch="Uniform"<br /> HorizontalAlignment="Stretch"<br /> VerticalAlignment="Stretch"/><br /> <Button x:Name="btnCamera" Grid.Row="1"<br /> Content="啟動相機程式" Click="btnCamera_Click"/><br /> </Grid><br />
using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Net;<br />using System.Windows;<br />using System.Windows.Controls;<br />using System.Windows.Documents;<br />using System.Windows.Input;<br />using System.Windows.Media;<br />using System.Windows.Media.Animation;<br />using System.Windows.Shapes;<br />using Microsoft.Phone.Controls;<br />// 引入以下命名空間。<br />using Microsoft.Phone.Tasks;<br />using System.Windows.Media.Imaging;</p><p>namespace PhoneApp1<br />{<br /> public partial class MainPage : PhoneApplicationPage<br /> {<br /> // 第一步,聲明類層級的局部變數,並執行個體化。<br /> CameraCaptureTask MyCamera = new CameraCaptureTask();</p><p> // 建構函式<br /> public MainPage()<br /> {<br /> InitializeComponent();</p><p> // 第二步,在頁面建構函式中註冊完成回調事件<br /> MyCamera.Completed += new EventHandler<PhotoResult>(MyCamera_Completed);<br /> }</p><p> private void btnCamera_Click(object sender, RoutedEventArgs e)<br /> {<br /> // 第三步,顯示組件<br /> MyCamera.Show();<br /> }</p><p> // 第四步,處理事返回結果<br /> void MyCamera_Completed(object sender, PhotoResult e)<br /> {<br /> // 確定使用者確認了還是取消了操作。<br /> if (e.TaskResult == TaskResult.OK)<br /> {<br /> // 從返回的流中建立圖象<br /> BitmapImage bmp = new BitmapImage();<br /> try<br /> {<br /> bmp.SetSource(e.ChosenPhoto);<br /> // 把圖象作為Image控制項的源。<br /> // 防止非同步回調直接存取UI元素,故應使用BeginInvoke方法。<br /> Dispatcher.BeginInvoke(() =><br /> {<br /> this.img.Source = bmp;<br /> });<br /> }<br /> catch (Exception ex)<br /> {<br /> MessageBox.Show(ex.Message);<br /> }</p><p> }<br /> }<br /> }<br />}
當然,在模擬器中你是不能進行拍攝的,但可以進行類比操作,也就是說無論你拍的什麼,最後都是返回同一張照片。
二、PhotoChooserTask選取器。
這個選取器已經包含CameraCaptureTask的功能,當然,它主要是為了選擇圖片。
1、ShowCamera屬性設定是否顯示可以讓使用者啟動相機的按鈕;
2、PixelHeight:選擇圖片後將其裁剪的高度;
3、PixelWidth屬性與上面相同,裁剪寬度。
照片被選擇後,以流的形式返回,駝過Completed事件的參數PhotoResult的ChosenPhoto屬性擷取。
<Grid><br /> <Grid.RowDefinitions><br /> <RowDefinition Height="*"/><br /> <RowDefinition Height="auto"/><br /> </Grid.RowDefinitions><br /> <Image x:Name="img" Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0"/><br /> <Grid Grid.Row="1"><br /> <Grid.ColumnDefinitions><br /> <ColumnDefinition Width="auto"/><br /> <ColumnDefinition Width="auto"/><br /> <ColumnDefinition Width="auto"/><br /> <ColumnDefinition Width="auto"/><br /> </Grid.ColumnDefinitions><br /> <Grid.RowDefinitions><br /> <RowDefinition Height="auto"/><br /> <RowDefinition Height="auto"/><br /> </Grid.RowDefinitions><br /> <TextBlock Grid.Column="0" Grid.Row="0" Text="高度:"/><br /> <TextBlock Grid.Column="2" Grid.Row="0" Text="寬度:"/><br /> <TextBox x:Name="txtHeight" Grid.Column="1"<br /> Grid.Row="0" Width="160" Height="auto" FontSize="20"><br /> <TextBox.InputScope><br /> <InputScope><br /> <InputScopeName NameValue="Number"/><br /> </InputScope><br /> </TextBox.InputScope><br /> </TextBox><br /> <TextBox x:Name="txtWidth" Grid.Column="3"<br /> Grid.Row="0" Width="160" Height="auto" FontSize="20"><br /> <TextBox.InputScope><br /> <InputScope><br /> <InputScopeName NameValue="Number"/><br /> </InputScope><br /> </TextBox.InputScope><br /> </TextBox><br /> <CheckBox x:Name="chkShowCamera"<br /> Grid.Row="1" Grid.ColumnSpan="2"<br /> Content="顯示啟動相機"/><br /> <Button x:Name="btnShow"<br /> Grid.Column="2" Grid.Row="1"<br /> Grid.ColumnSpan="2"<br /> Content="選擇圖片..."<br /> Margin="5"<br /> Click="btnShow_Click"/><br /> </Grid><br /> </Grid><br />
using System;<br />using System.Collections.Generic;<br />using System.Linq;<br />using System.Net;<br />using System.Windows;<br />using System.Windows.Controls;<br />using System.Windows.Documents;<br />using System.Windows.Input;<br />using System.Windows.Media;<br />using System.Windows.Media.Animation;<br />using System.Windows.Shapes;<br />using Microsoft.Phone.Controls;<br />//<br />using Microsoft.Phone.Tasks;<br />using System.Windows.Media.Imaging;</p><p>namespace PhoneApp1<br />{<br /> public partial class Page1 : PhoneApplicationPage<br /> {<br /> PhotoChooserTask ptc = new PhotoChooserTask();</p><p> public Page1()<br /> {<br /> InitializeComponent();</p><p> ptc.Completed += new EventHandler<PhotoResult>(ptc_Completed);<br /> }</p><p> void ptc_Completed(object sender, PhotoResult e)<br /> {<br /> if (e.TaskResult == TaskResult.OK)<br /> {<br /> BitmapImage bmp = new BitmapImage();<br /> try<br /> {<br /> bmp.SetSource(e.ChosenPhoto);<br /> Dispatcher.BeginInvoke(() => {<br /> this.img.Source = bmp;<br /> });<br /> }<br /> catch (Exception ex)<br /> {<br /> MessageBox.Show(ex.Message);<br /> }<br /> }<br /> }</p><p> private void btnShow_Click(object sender, RoutedEventArgs e)<br /> {<br /> // 設定相關屬性<br /> ptc.PixelHeight = int.Parse(txtHeight.Text);<br /> ptc.PixelWidth=int.Parse(txtWidth.Text);<br /> ptc.ShowCamera = this.chkShowCamera.IsChecked.HasValue ? chkShowCamera.IsChecked.Value : false;</p><p> ptc.Show();<br /> }<br /> }<br />}