Настройка источника изображений из кода за формами Xamarin

У меня есть изображение base64, которое я преобразовал в формат «Imagesource» следующим образом.

imageName = Convert.ToString (output.d.XIMAGE);
                    byte[] data = Convert.FromBase64String (imageName);

                    guestsignature.Add (new guestSignature (ImageSource.FromStream (() => new MemoryStream (data))));

guestsignature-это бобовый объект, который я создал с помощью конструктора следующим образом.

public class guestSignature
{
    public ImageSource guestSignatureBase64{ get; private  set; }

    public guestSignature (ImageSource signature)
    {
        guestSignatureBase64 = signature;
    }
}

Я создал listview, чтобы добавить следующие изображения.

<ListView x_Name="GuestSignatureList" RowHeight="100" SeparatorVisibility="Default" BackgroundColor="Transparent">
                    <ListView.ItemTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <StackLayout Padding="10,10,0,0" Orientation="Vertical" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
                                    <Image WidthRequest="500" HeightRequest="500" Source="{Binding guestSignatureBase64}">
                                    </Image>
                                </StackLayout>
                            </ViewCell>
                        </DataTemplate>
                    </ListView.ItemTemplate>
                </ListView>

а затем я добавляю объект guest detail в список.

GuestSignatureList.ItemsSource = guestsignature;

Проблема заключается в том, что, даже если Источник изображения устанавливается, изображение не отображается в listview. В чем может заключаться проблема? пожалуйста, кто-нибудь помогите.

2 ответа

  1. Добавьте строку в guestSignature и попытайтесь отобразить ее в ячейке, чтобы увидеть, является ли это проблемой привязки или проблемой отображения изображения.

  2. Прежде всего, я бы рекомендовал создать пользовательскую IValueConverterстроку для преобразования Base64, в ImageSourceкоторую будут использоваться все ваши приложения. Это просто — для данной строки Base64 он возвращаетImageSource

    public class Base64ToImageSourceConverter : IValueConverter
        {
            public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                //Try to read value as string and convert it to ImageSource using streams
                //If the operation fails for some reason, return null.
                try
                {
                    var image = value.ToString();
                    if (image == null)
                        return null;
                    byte[] data = System.Convert.FromBase64String(image);
    
                    var imageSource = ImageSource.FromStream(() => new MemoryStream(data));
                    return imageSource;
                }
                catch
                {
                    return null;
                }
    
            }
    
            public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
            {
                throw new NotImplementedException();
            }
        }
    

    В xaml добавьте вновь созданный преобразователь в свой ResourceDictionaryи привязать к свойству изображения в кодировке Base64 с помощью преобразователя.

    <ContentPage 
                 
                 
                 x_Class="Test.Views.ImagePage">
      <ContentPage.Resources>
        <ResourceDictionary>
          <converters:Base64ToImageSourceConverter x_Key="Base64ToImageSourceConverter"/>
        </ResourceDictionary>
      </ContentPage.Resources>
      <Image
        Source="{Binding Image, Converter={StaticResource Base64ToImageSourceConverter}}"
        VerticalOptions="Center"
        HorizontalOptions="FillAndExpand" />
    </ContentPage>
    

    Я протестировал образец на iOS и Android, и он работает.
    Если это не работает, убедитесь, что строка Base64 верна. Вы можете проверить это онлайн, используя такой инструмент, как этот .

    Вы можете найти полный проект Base64Sample здесь .