0

Windowsストア用に作成したアプリのWindows Phone 8アプリを作成しています.PhotoChooserタスクを使用して、ユーザーがプロフィール写真をアップロードできるようにしています。

ストア版ではストリームと FileOpenPicker を使っていましたが、PhotoChooser タスクでストリームを使う方法がわかりません。

これは私がWindowsストアで行った方法であり、完璧です:

   StorageFile image;

   public bunForm()
    {
        image = null;
        this.InitializeComponent();
    }

   private async void choosePic(object sender, Windows.UI.Xaml.RoutedEventArgs e)
    {

        FileOpenPicker openPicker = new FileOpenPicker();
        openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
        openPicker.ViewMode = PickerViewMode.Thumbnail;

        // Filter to include a sample subset of file types
        openPicker.FileTypeFilter.Clear();
        openPicker.FileTypeFilter.Add(".bmp");
        openPicker.FileTypeFilter.Add(".png");
        openPicker.FileTypeFilter.Add(".jpeg");
        openPicker.FileTypeFilter.Add(".jpg");

        // Open a stream for the selected file


        var file = await openPicker.PickSingleFileAsync();
        if (file != null)
        {
            image = file;
            var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);

            bunPic.Visibility = Visibility.Visible;

            // Ensure a file was selected
            if (file != null)
            {
                // Ensure the stream is disposed once the image is loaded
                using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
                {
                    // Set the image source to the selected bitmap
                    BitmapImage bitmapImage = new BitmapImage();

                    await bitmapImage.SetSourceAsync(fileStream);// bitmapImage.UriSource.ToString();
                    bunPic.Source = bitmapImage;
                }
            }
        }

    }

そして、これが私がWindows Phone 8で試している方法です:しかし、 (openPicker.PickSingleFileAsync();) 行でエラーが発生します。

public BunForm()
    {
        InitializeComponent();

        image = null;
        this.photoChooserTask = new PhotoChooserTask();
        this.photoChooserTask.Completed += new EventHandler<PhotoResult>(photoChooserTask_Completed);

    }

    StorageFile image;

private void choosePic(object sender, RoutedEventArgs e)
    {
        photoChooserTask.Show();
    }

private async void photoChooserTask_Completed(object sender, PhotoResult e)
    {
        //this is the only line that gives me error 
        var file = await openPicker.PickSingleFileAsync();
        ///

        if (file != null)
        {
            image = file;
            var stream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read);

            if (file != null)
            {
                // Ensure the stream is disposed once the image is loaded
                using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
                {

                    MessageBox.Show(e.ChosenPhoto.Length.ToString());

                    //Code to display the photo on the page in an image control named myImage.
                    System.Windows.Media.Imaging.BitmapImage bmp = new System.Windows.Media.Imaging.BitmapImage();
                    bmp.SetSource(e.ChosenPhoto);
                    myImage.Source = bmp;
                }
            }

        }
        Debug.WriteLine("pic done");
    }  

Windows Phone 8のストレージファイルに画像を保存するにはどうすればよいですか?

4

2 に答える 2

2

MSDN ページに記載されているように、 OpenFilePickerは C# WP8 アプリでは使用できませんが、PhotoChooserTaskを使用して簡単にプロフィール画像をアップロードできます。

// first invoke the task somewhere
PhotoChooserTask task = new PhotoChooserTask();
task.Completed += task_Completed;
task.Show();        

// handle the result
async void task_Completed(object sender, PhotoResult e)
{
    // no photo selected
    if (e.ChosenPhoto == null) return;

    // get the file stream and file name
    Stream photoStream = e.ChosenPhoto;
    string fileName = Path.GetFileName(e.OriginalFileName);

    // persist data into isolated storage
    StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
    using (Stream current = await file.OpenStreamForWriteAsync())
    {
        await photoStream.CopyToAsync(current);
    }

    ...

    // how to read the data later
    StorageFile file2 = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
    Stream imageStream = await file2.OpenStreamForReadAsync();

    // display the file as image
    BitmapImage bi = new BitmapImage();
    bi.SetSource(imageStream);
    // assign the bitmap to Image in XAML: <Image x:Name="img"/>
    img.Source = bi;
}
于 2013-11-10T11:58:14.950 に答える
0

これによると

Windows Phone 8
This API is supported in native apps only.


FileOpenPicker クラスは使用できません。OpenFilePicker が機能
しないという問題に対する回答は既にあります

于 2013-11-10T07:48:47.890 に答える