2016-11-09 7 views
0

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

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

    ... 

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

Возможно, проблема может быть решена путем установки URL-адреса с помощью нового Ури (...), как описано в документации

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 студии (версия 6.1.2, построить 44, обновить канал "бета", OS X).

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

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

Alex

+0

Почему ImageSource.FromUri не работает для вас описанных в документации? –

+0

Привет, как только я пытаюсь привязать значение «uri», я получаю сообщение: Ошибка CS1929: Тип 'Xamarin.Forms.Image 'не содержит член' SetBinding' и лучший метод расширения перегружает 'Xamarin '. Forms.TemplateExtensions.SetBinding (этот Xamarin.Forms.DataTemplate, Xamarin.Forms.BindableProperty, string) 'требует экземпляра типа 'Xamarin.Forms.DataTemplate' (CS1929) – AlexM

ответ

0

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

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

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); } 
      } 

     } 

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

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)); 

      } 
     } 
    } 

Возможно, что помогает другим людям;)