Windows Phone開發(fā)(23):啟動器與選擇器之二
一、CameraCaptureTask選擇器。
它用于啟動照相機(jī),當(dāng)你拍下照片后,自動把照的字節(jié)流返回給調(diào)用方應(yīng)用程序。前文說過,啟動器和選擇的使用方法和步驟都是一樣的。對于 CameraCaptureTask組件也如此,不過注意的一點(diǎn)是,處理Completed事件時一定要記住,盡可能的使用頁面類的 Dispatcher.BeginInvoke方法,因?yàn)楫惒交卣{(diào)直接訪問UI元素是不安全的,極有可能會引發(fā)異常,但我不是說絕對。
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="*"/>
- <RowDefinition Height="auto"/>
- </Grid.RowDefinitions>
- <Image x:Name="img" Grid.Row="0" Stretch="Uniform"
- HorizontalAlignment="Stretch"
- VerticalAlignment="Stretch"/>
- <Button x:Name="btnCamera" Grid.Row="1"
- Content="啟動相機(jī)程序" Click="btnCamera_Click"/>
- </Grid>
- 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 Microsoft.Phone.Tasks;
- using System.Windows.Media.Imaging;
- namespace PhoneApp1
- {
- public partial class MainPage : PhoneApplicationPage
- {
- // 第一步,聲明類級別的局部變量,并實(shí)例化。
- CameraCaptureTask MyCamera = new CameraCaptureTask();
- // 構(gòu)造函數(shù)
- public MainPage()
- {
- InitializeComponent();
- // 第二步,在頁面構(gòu)造函數(shù)中注冊完成回調(diào)事件
- MyCamera.Completed += new EventHandler<PhotoResult>(MyCamera_Completed);
- }
- private void btnCamera_Click(object sender, RoutedEventArgs e)
- {
- // 第三步,顯示組件
- MyCamera.Show();
- }
- // 第四步,處理事返回結(jié)果
- void MyCamera_Completed(object sender, PhotoResult e)
- {
- // 確定用戶確認(rèn)了還是取消了操作。
- if (e.TaskResult == TaskResult.OK)
- {
- // 從返回的流中創(chuàng)建圖象
- BitmapImage bmp = new BitmapImage();
- try
- {
- bmp.SetSource(e.ChosenPhoto);
- // 把圖象作為Image控件的源。
- // 防止異步回調(diào)直接訪問UI元素,故應(yīng)使用BeginInvoke方法。
- Dispatcher.BeginInvoke(() =>
- {
- this.img.Source = bmp;
- });
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- }
- }
- }
當(dāng)然,在模擬器中你是不能進(jìn)行拍攝的,但可以進(jìn)行模擬操作,也就是說無論你拍的什么,最后都是返回同一張照片。
別走開,下頁更精彩!
#p#
二、PhotoChooserTask選擇器。
這個選擇器已經(jīng)包含CameraCaptureTask的功能,當(dāng)然,它主要是為了選擇圖片。
1、ShowCamera屬性設(shè)置是否顯示可以讓用戶啟動相機(jī)的按鈕;
2、PixelHeight:選擇圖片后將其裁剪的高度;
3、PixelWidth屬性與上面相同,裁剪寬度。
照片被選擇后,以流的形式返回,駝過Completed事件的參數(shù)PhotoResult的ChosenPhoto屬性獲取。
- <Grid>
- <Grid.RowDefinitions>
- <RowDefinition Height="*"/>
- <RowDefinition Height="auto"/>
- </Grid.RowDefinitions>
- <Image x:Name="img" Stretch="Uniform" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="0"/>
- <Grid Grid.Row="1">
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="auto"/>
- <ColumnDefinition Width="auto"/>
- <ColumnDefinition Width="auto"/>
- <ColumnDefinition Width="auto"/>
- </Grid.ColumnDefinitions>
- <Grid.RowDefinitions>
- <RowDefinition Height="auto"/>
- <RowDefinition Height="auto"/>
- </Grid.RowDefinitions>
- <TextBlock Grid.Column="0" Grid.Row="0" Text="高度:"/>
- <TextBlock Grid.Column="2" Grid.Row="0" Text="寬度:"/>
- <TextBox x:Name="txtHeight" Grid.Column="1"
- Grid.Row="0" Width="160" Height="auto" FontSize="20">
- <TextBox.InputScope>
- <InputScope>
- <InputScopeName NameValue="Number"/>
- </InputScope>
- </TextBox.InputScope>
- </TextBox>
- <TextBox x:Name="txtWidth" Grid.Column="3"
- Grid.Row="0" Width="160" Height="auto" FontSize="20">
- <TextBox.InputScope>
- <InputScope>
- <InputScopeName NameValue="Number"/>
- </InputScope>
- </TextBox.InputScope>
- </TextBox>
- <CheckBox x:Name="chkShowCamera"
- Grid.Row="1" Grid.ColumnSpan="2"
- Content="顯示啟動相機(jī)"/>
- <Button x:Name="btnShow"
- Grid.Column="2" Grid.Row="1"
- Grid.ColumnSpan="2"
- Content="選擇圖片..."
- Margin="5"
- Click="btnShow_Click"/>
- </Grid>
- </Grid>
- 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 Microsoft.Phone.Tasks;
- using System.Windows.Media.Imaging;
- namespace PhoneApp1
- {
- public partial class Page1 : PhoneApplicationPage
- {
- PhotoChooserTask ptc = new PhotoChooserTask();
- public Page1()
- {
- InitializeComponent();
- ptc.Completed += new EventHandler<PhotoResult>(ptc_Completed);
- }
- void ptc_Completed(object sender, PhotoResult e)
- {
- if (e.TaskResult == TaskResult.OK)
- {
- BitmapImage bmp = new BitmapImage();
- try
- {
- bmp.SetSource(e.ChosenPhoto);
- Dispatcher.BeginInvoke(() => {
- this.img.Source = bmp;
- });
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- }
- }
- private void btnShow_Click(object sender, RoutedEventArgs e)
- {
- // 設(shè)置相關(guān)屬性
- ptc.PixelHeight = int.Parse(txtHeight.Text);
- ptc.PixelWidth=int.Parse(txtWidth.Text);
- ptc.ShowCamera = this.chkShowCamera.IsChecked.HasValue ? chkShowCamera.IsChecked.Value : false;
- ptc.Show();
- }
- }
- }