2016-06-21 9 views
1

画像を選択したときの基礎となる画像データを取得しようとしています。カメラの機能と写真を選択する機能は完全に機能していますが、私はただ一つ欠落しており、それは画像データを取得することです。 imagedataは返されたmediaFileの内部にありますが、私は自分のcontentPageにどのように届くかわかりません。viewmodelでmediaFileにアクセスしてコンテンツページで使用するにはどうすればよいですか?

(私はこのプロジェクトの使用:https://github.com/XLabs/Xamarin-Forms-Labs/wiki/Camera)を

アイデアがcontentpageに私のデータベースに画像データを送信することです。

これは "CameraViewModel" という名前のviewmodelです:あなたはプロパティを作成することができ

private MediaFile _file; 
    public MediaFile File 
    { 
     get { return _file; } 
     set 
     { 
      _file = value; 
     } 
    } 

public async Task SelectPicture() 
    { 
     Setup(); 

     ImageSource = null; 

     try 
     { 
      File = await _Mediapicker.SelectPhotoAsync(new CameraMediaStorageOptions 
       { 
        DefaultCamera = CameraDevice.Front, 
        MaxPixelDimension = 400 
       }); 

      VideoInfo = File.Path; 
      ImageSource = ImageSource.FromStream(() => File.Source); 


     } 
     catch (System.Exception ex) 
     { 
      Status = ex.Message; 

     } 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 

     File = value as MediaFile; 
     return ImageSource.FromStream(() => File.Source); 
    } 
+0

「mediaFile」は、いったん終了すると、「finally」に取り消すことをお勧めします: 'finally {if(mediaFile!= null){mediaFile.Dispose(); }} ' – hvaughan3

+0

SelectPictureFunctionの内側に追加しますか?その後、私はContentPageでどのようにそれにアクセスできますか? – medvedo

+0

はい、それは 'SelectPicture()'の 'catch()'の後に行きます。あなたは@EgorGromadskiyが答えているように、 'try'の中のViewModelプロパティにそれを割り当てたいでしょう。 – hvaughan3

答えて

2

CameraViewModel cameraOps = null; 

    public PhotoPage() 
    { 
     InitializeComponent(); 

     cameraOps = new CameraViewModel(); 
     cameraOps. //trying to reach the mediafile here 
    } 

更新コード:今、私はこれを持って私のcontentpageで

public async Task SelectPicture() 
    { 
     Setup(); 

     ImageSource = null; 

     try 
     { 
      var mediaFile = await _Mediapicker.SelectPhotoAsync(new CameraMediaStorageOptions 
       { 
        DefaultCamera = CameraDevice.Front, 
        MaxPixelDimension = 400 
       }); 

      VideoInfo = mediaFile.Path; 
      ImageSource = ImageSource.FromStream(() => mediaFile.Source); 


     } 
     catch (System.Exception ex) 
     { 
      Status = ex.Message; 

     } 
    } 

ビューモデル:

private MediaFile _file; 
    public MediaFile File 
    { 
     get { return _file; } 
     set 
     { 
      _file = value; 
      OnPropertyChanged(); 
     } 
    } 

そしてContentPageにそれをバインドします

<Image Source="{Binding File}, Converter={StaticResource MediaFileToImageSourceConverter}"> 

コンバータ:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var file = value as MediaFile; 
     return ImageSource.FromStream(() => file.GetStream())); 
    } 

更新されたコード:(ないMVVMの最高の伝統では、しかし、あなたのサンプル用)

public async Task<MediaFile> SelectPicture() 
    { 
     Setup(); 

     MediaFile file = null; 

     try 
     { 
      file = await _Mediapicker.SelectPhotoAsync(new CameraMediaStorageOptions 
      { 
       DefaultCamera = CameraDevice.Front, 
       MaxPixelDimension = 400 
      }); 

     } 
     catch (System.Exception ex) 
     { 
      Status = ex.Message; 
     } 

     return file; 
    } 

コード裏:

public async void OnTakePhotoButtonClicked(object sender, EventArgs args) 
    { 
     var file = await cameraOps.SelectPicture(); 
     someImage.ImageSource = ImageSource.FromStream(() => file.Source); 
    } 
+0

それで私のコンテンツページにコンバータを追加しますか?私は 'GetStream'コマンドを見つけることができません。 – medvedo

+0

代わりに、あなたのソリューション 'ImageSource.FromStream(()=> file.Source))を使用してください); –

+0

OnPropertyChanged();エラー:メソッドのオーバーロードがありませんonpropertychangedは0引数を取ります – medvedo

関連する問題