2017-05-28 3 views
1

J'essaye de créer l'application de WPF qui obtient des données du service. Les données sont des URL d'image. Parfois, le service renvoie Data URLs.Afficher l'URL de données dans WPF

Si je tente de lier cette URL au contrôle de l'image comme:

<Image Source="{Binding URL}" /> 

Il travaille pour l'URL régulière, mais les URL de données ne sont pas affichées.

Existe-t-il un moyen d'afficher l'URL de données dans le contrôle WPF?

+0

Vous pourrait créer un convertisseur de valeur pour interpréter l'URL de données et le convertir en un flux que l'image peut lire – Nkosi

+0

Pouvez-vous me montrer un exemple de la façon de le faire? – nrofis

Répondre

1

Créer un convertisseur de valeur, qui convertit les données de base64 à un BitmapImage:

public class DataUrlConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var data = (string) value; 
     var base64Data = Regex.Match(data, @"data:image/(?<type>.+?),(?<data>.+)").Groups["data"].Value; 
     var binData = System.Convert.FromBase64String(base64Data); 

     var image = new BitmapImage(); 
     using (var mem = new MemoryStream(binData)) 
     { 
      image.BeginInit(); 
      image.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
      image.CacheOption = BitmapCacheOption.OnLoad; 
      image.StreamSource = mem; 
      image.EndInit(); 
     } 
     image.Freeze(); 
     return image; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Ensuite, créez une ressource de conversion:

<Window.Resources> 
    <local:DataUrlConverter x:Key="DataUrlConverter"></local:DataUrlConverter> 
</Window.Resources> 

et l'utiliser comme ceci:

<Image Source="{Binding URL, Converter={StaticResource DataUrlConverter}}" />