Привязка URI изображения через изображение.SetBinding() работает неправильно

Я использую следующий фрагмент кода для привязки url-адреса изображения к объекту изображения (используется в качестве одного элемента в объекте ViewCell).

   ...
   Image Picture = new Image()
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.StartAndExpand
            }; // ImageSource.FromUri(new Uri("sImageUrl")))
            Picture.SetBinding(Image.SourceProperty, "sImageUrl");

   ...

Изображения в списке, для которых я использую этот вид ячейки, не всегда загружаются. Я не смог определить точную причину проблемы, но я думаю, что проблема заключается в процессе загрузки (для загрузки изображений из url/интернета)..

Возможно, проблема может быть решена путем установки url через новый Uri(…) как описано в документации

var webImage = new Image { Aspect = Aspect.AspectFit };
webImage.Source = ImageSource.FromUri(new Uri("https://xamarin.com/content/images/pages/forms/example-app.png"));

Теперь мой вопрос: существует ли обходной путь для привязки объекта uri? например.

   ...
   Image Picture = new Image()
            {
                Aspect = Aspect.AspectFit,
                HorizontalOptions = LayoutOptions.StartAndExpand
            }; // ImageSource.FromUri(new Uri("sImageUrl")))
            Picture.SetBinding(Image.SourceProperty, ImageSource.FromUri(new Uri("sImageUrl")));

   ...

Я работаю с Xamarin studio (версия 6.1.2, сборка 44, канал обновления «бета», os x).

Было бы здорово, если бы кто-то получил tipp.

Большое спасибо,

Алексей

1 ответ

  1. после еще нескольких попыток я нашел решение.. Я не уверен, что это безопасный / профессиональный способ.. Но пока, кажется, это работает.

    Что я сделал: я реализовал свой собственный класс «AsyncSrcImage», произвел его из Image и добавил другое связываемое свойство:

    public class AsyncSrcImage : Image
            {
                private static String sDefaultURL = "";
    
                public static readonly BindableProperty AsyncImgUrlProperty = BindableProperty.Create(nameof(AsyncImgUrl), typeof(String), typeof(AsyncSrcImage), sDefaultURL);
                public String AsyncImgUrl
                {
                    get { return (String)GetValue(AsyncImgUrlProperty); }
                    set { SetValue(AsyncImgUrlProperty, value); }
                }
    
            }
    

    Кроме того, я настроил процесс рендеринга с помощью пользовательского рендера. Там я загружаю Источник изображения через новый Uri(…) как описано в документации:

    using Xamarin.Forms.Platform.Android;
    using Xamarin.Forms;
    using System;
    
    [assembly: ExportRenderer(typeof(AsyncSrcImage), typeof(AsyncSrcImageRenderer))]
    
        public class AsyncSrcImageRenderer : ImageRenderer
        {
            protected override void OnElementChanged(ElementChangedEventArgs<Image> e)
            {
                base.OnElementChanged(e);
    
                AsyncSrcImage oImage = (AsyncSrcImage)Element;
    
                if (oImage != null && oImage.AsyncImgUrl != "")
                {
    
                    oImage.Source = ImageSource.FromUri(new Uri(oImage.AsyncImgUrl));
    
                }
            }
        }
    

    Может быть, это помогает другим людям 😉