信息
您所需的主题如下所示。但此主题未包含在此库中。

如何从 Windows Phone 8 的 Direct3D 应用使用照片选取器

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

 

本主题介绍如何从 Windows Phone Direct3D 应用 显示照片选取器,以便用户可以从手机图片库中选择照片。照片以 StorageFile 对象形式返回至您的应用。

使用 PickSingleFileAsync() 方法启动照片选取器。在 Windows 8 中,可使用该方法选取任何类型的文件,但在 Windows Phone 中,只能选择图像。因此,必须正确设置 FileOpenPicker 对象的一些属性,否则选取器将不会启动。下表显示这些属性及其必需的值。

属性

必需的值

ViewMode

PickerViewMode::Thumbnail

SuggestedStartLocation

PickerLocationId::PicturesLibrary

FileTypeFilter

“*”

如果用户在选取器操作已经完成,而且应用被挂起后导航离开应用,那么应用可以通过调用 ResumePickSingleFileAsync() 继续进行选取操作,检索用户所选的文件。在 Windows Phone 上,PickSingleFileAsync() 方法具有可选 ID 参数。如果应用使用多个图片选取器,则可使用此应用定义的 ID 字符串确定在应用挂起前启动的是哪个选取器。

使用照片选取器

  1. 创建新的 Windows Phone Direct3D 应用。本例假设命名该项目为 NativePhotoPicker。

  2. Completed 事件的事件处理程序声明添加至 NativePhotoPicker.h 头文件中。图片选取操作完成时调用此事件。该操作的结果类型是对将包含返回图像的 StorageFile 的引用。

    
    	void PickSingleFileCompletedHandler(Windows::Foundation::IAsyncOperation<Windows::Storage::StorageFile^>^ operation, Windows::Foundation::AsyncStatus status);
    
    
    
  3. 声明成员变量,该成员变量将包含当前活动选取器的应用定义的 ID。如果您的应用使用多个选取器,那么该变量将帮助您确定哪一个返回了。如果您的应用只使用一个选取器,则可以跳过此步骤。

    
    	Platform::String^ m_pickerID;
    
    
    
  4. 添加 using 语句以便引用 Windows.StorageWindows.Storage.Pickers 命名空间至 NativePhotoPicker.cpp 的顶部。

  5. 创建 FileOpenPicker 类的新实例。如本主题前面所述,必须设置 FileOpenPicker 的视图模式、启动位置和文件类型筛选器必需的值,否则选取操作将失败。

    调用 PickSingleFileAsync() 开始选取操作。在本例中,该方法的重载(需要一个字符串)用于演示在操作过程中,当应用挂起、然后继续时,如何跟踪哪个选取操作处于进程中。如果您的应用只使用一个选取器,则可以跳过此步骤。

    最后,挂钩 IAsyncOperation 对象(由 PickSingleFileAsync() 返回)的 Completed() 事件的事件处理程序。

    在本例中,用于启动照片选取器的代码被放入 OnPointerPressed 方法中,该方法包含在 Direct3D 应用 项目模板里。若触摸屏幕的任何位置,则该处理程序将被调用。

    
    void NativePhotoPicker::OnPointerPressed(CoreWindow^ sender, PointerEventArgs^ args)
    {
        // Insert event handling here
    	FileOpenPicker^ fileOpenPicker = ref new FileOpenPicker();
    	fileOpenPicker->ViewMode = PickerViewMode::Thumbnail;
    	fileOpenPicker->SuggestedStartLocation = PickerLocationId::PicturesLibrary;
    	fileOpenPicker->FileTypeFilter->Append("*");
    
    	m_pickerID = "ID_12345";
    	IAsyncOperation<StorageFile^>^ pickSingleFileOperation = fileOpenPicker->PickSingleFileAsync(m_pickerID);
    
    	pickSingleFileOperation->Completed = ref new AsyncOperationCompletedHandler<StorageFile^>(this, &NativePhotoPicker::PickSingleFileCompletedHandler);
    }
    
    
    
  6. 添加 Completed() 事件处理程序的实现。调用 GetResults() 以获取包含图像数据的 StorageFile 对象。如果使用多个选取器,则可以检查包含选取器 ID 的成员变量,以了解哪个选取器激发了该事件。

  7. 添加代码以处理应用激活和停用。在 Windows Phone 中,在选取器操作过程中,应用可能先被挂起,然后被重新激活。如果应用挂起时,操作还未完成,则选取器将自动关闭,如同用户取消操作一样。但是,如果用户完成了选取器操作,但应用在引发 Completed() 事件之前被挂起,那么传递进应用的 Activated 事件中的 IActivatedEventArgs 将具有 Kind 属性,属性值为 ActivationKind::PickerReturned。如果是这种情况,而且您在启动选取器时指定了 ID,那么您可以将 args 对象作为 IPickerReturnedActivatedEventArgs 对象进行强制转换,并获取 PickerOperationId() 属性。然后您只需调用 ResumePickSingleFileAsync() 来继续选取操作,并且挂接您之前使用的同一事件处理程序来处理结果。

通过应用挂起和激活来测试选取器

  • 在应用开发期间,测试应用是否能适当处理应用挂起和激活很重要。在 Visual Studio 中的“项目”菜单上,单击“[Project Name] 属性”。 在“属性页” 对话框中的“配置属性”下,单击“调试”。将“在停用时执行逻辑删除”的值更改为“是”。现在,当您在启用调试的情况下启动应用,然后启动照片选取器时,应用将自动挂起。当您使用“后退”按钮返回应用时,Activated 事件处理程序中的代码将用所选图像运行并调用您的自定义事件处理程序。

显示: