2016-12-15 2 views
0

2つのソースからの画像の表示に問題がありました。私はMainPageとMainPageViewModelを持っています。最初にページがロードされると、パスを使用してプロジェクトフォルダからイメージを取得します。 だからMainPage.xamlをViewModelのFilePickerとプロジェクトフォルダからの画像のバインド

<Image Source="{Binding ImageUri}" VerticalAlignment="Center" HorizontalAlignment="Center" Width="300" Height="300"/> 

そしてMainPageViewModel

private string _imageUri; 
public RelayCommand PickPhotoCommand { get; set; } 
public string ImageUri 
{ 
    get { return _imageUri; } 
    set 
    { 
     _imageUri = value; 
     NotifyPropertyChanged("ImageUri"); 
    } 
} 

ですべてが明確でシンプルです。しかし、ユーザーはfilePickerから画像を選択することができ、古い画像を選択した画像に置き換える必要があります。しかし、FilePickerから返されたStorageFileからUriを取得することはできません。唯一のオプションは、StorageFileからSetSourceAsync()を使用してBitmapImageを取得することです。 xamlページに画像を表示する際の問題を解決する2つのソリューションがあります。 ティは最初である - 私は

ImageUri = new BitmapImage(new Uri("ms-appx:///Assets/StoreLogo.png")); 

を使用してのBitmapImageに私のImageUriプロパティタイプを変更することができ、プロジェクトフォルダからイメージのためか、どこかので、両方のソースのためのBitmapImageを使用しています。しかし私のチームリーグは、BitmapImageが画像(スケール、トリミングなど)を変更するために使用されていたことを言います。それは意味的に間違っています。 2番目の解決策は、 - FilePickerからファイルを取得し、Temprorary Folderにコピーして、FolderからcopiedFileを取得し、そのパスを取得します。

StorageFile file = await openPicker.PickSingleFileAsync(); 
StorageFolder tempFolder = ApplicationData.Current.TemporaryFolder; 
StorageFile copiedFile = await file.CopyAsync(tempFolder, file.Name, NameCollisionOption.ReplaceExisting); 
var fileFromTemp = await ApplicationData.Current.TemporaryFolder.GetFileAsync(copiedFile.Name); 
ImageUri = fileFromTemp.Path; 

私たちはImageUriプロパティの文字列を使用できます。 お客様のご意見をお聞かせください。

+2

「BitmapImageを使用して画像を変更する(スケール、トリミングなど)」とはどういう意味ですか?あなたのチームリーダーは、おそらく彼が何を話しているのか分からないでしょう。 BitmapImageは正しいアプローチです。イメージファイルを一時的な場所にコピーするのは簡単ではありません。 – Clemens

答えて

0

ビューモデルプロパティのタイプをImageSource、つまりImageコントロールのSourceプロパティのタイプに変更します。

private ImageSource image; 
public ImageSource Image 
{ 
    get { return image; } 
    set 
    { 
     image = value; 
     NotifyPropertyChanged("Image"); 
    } 
} 

BitmapImageを簡単に割り当てることができます。

viewModel.Image = new BitmapImage(new Uri("ms-appx:///Assets/StoreLogo.png")); 

又は

var bitmap = new BitmapImage(); 
using (var stream = await file.OpenReadAsync()) 
{ 
    await bitmap.SetSourceAsync(stream); 
} 
viewModel.Image = bitmap; 

WriteableBitmapのような他の派生型のインスタンス。

+0

ページ上のイメージコントロールにどのようにバインドしますか?あなたのソリューションと私の違いは、BitmapImageタイプのプロパティを使用する場合です。 –

+0

既に行ったようにバインドします。 ''相違点は 'ImageSource'は' BitmapImage'の基本クラスであり、どの具体的な派生型を渡すかについてより大きな柔軟性を提供します。 – Clemens

関連する問題