2016-12-15 3 views
0

Ich hatte ein Problem mit der Anzeige von Bild, das aus 2 Quellen kommt. Ich habe eine MainPage und MainPageViewModel. Beim ersten Laden der Seite erhalten wir ein Bild aus dem Projektordner mit seinem Pfad. So in MainPage.xamlBinding Bild von FilePicker und Projektordner in ViewModel

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

Und MainPageViewModel

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

Alles ist klar und einfach. Aber dann kann der Benutzer ein Bild von filePicker auswählen und das alte Bild muss durch das ausgewählte Bild ersetzt werden. Aber wir können Uri nicht von StorageFile abrufen, das von FilePicker zurückgegeben wurde, und nur die Option BitmapImage von StorageFile mit SetSourceAsync() abrufen. Ich habe zwei Lösungen, die mein Problem mit der Anzeige von Bildern auf meiner XAML-Seite lösen. Thi erstes ist - verwenden Bitmap für beiden Quellen, so zum Bild von Projektordnern oder sonstwo ich

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

verwenden kann und meinen ImageUri Eigenschaft Typen Bitmap ändern. Aber mein Teamlead sagt, dass das keine gute Lösung ist, weil BitmapImage benutzt wurde um das Bild zu ändern (Scale, Crop etc.). Es ist also semantisch inkorrekt. Die zweite Lösung ist - Datei von FilePicker holen, in Temprorary Folder kopieren und dann kopierte Datei von Folder und nehmen Sie den Pfad.

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; 

Und wir können String für unsere ImageUri Eigenschaft verwenden. Bitte geben Sie Ihr Feedback, welche dieser Lösungen am besten und korrekter ist?

+2

"BitmapImage verwendet, um Bild (Scale, Crop etc.) zu ändern", was genau bedeutet das? Ihre Teamleitung weiß wahrscheinlich nicht, wovon er spricht. BitmapImage ist hier der richtige Ansatz. Das Kopieren von Bilddateien an einen temporären Speicherort ist schlichtweg Unsinn. – Clemens

Antwort

0

Ändern Sie den Typ Ihrer Ansichtsmodelleigenschaft in ImageSource, d. H. Den Typ der Source-Eigenschaft des Image-Steuerelements.

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

Jetzt können Sie leicht ein BitmapImage z zuweisen

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

oder

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

sondern auch Instanzen anderer abgeleiteten Typen, wie WriteableBitmap.

+0

Wie verbinde ich es mit meiner Bildkontrolle auf Seite? Und welchen Unterschied zwischen Ihrer Lösung und meiner, wo ich die Eigenschaft mit BitmapImage Typ –

+0

verwenden Sie werden es wie Sie bereits binden: ''. Der Unterschied besteht darin, dass "ImageSource" eine Basisklasse von "BitmapImage" ist, die eine größere Flexibilität hinsichtlich des konkreten abgeleiteten Typs bietet, den Sie übergeben. – Clemens

Verwandte Themen