通过Image.SetBinding()绑定图像URI无法正常工作

时间:2016-11-09 13:45:29

标签: forms image xamarin uri

我使用以下代码段将图片网址绑定到图片对象(用作ViewCell对象中的一个元素)。

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

   ...

列表中我使用该单元格视图的图像不会始终加载。我无法确定问题的确切原因,但我认为问题是加载过程(用于从网址/互联网加载图像)..

也许问题可以通过新文件中描述的新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对象的解决方法? e.g。

   ...
   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,更新频道" beta",os x)。

如果有人得到了tipp会很棒。

非常感谢,

亚历

1 个答案:

答案 0 :(得分:0)

经过一些尝试,我找到了一个解决方案......我不确定它是否是一种安全/专业的方式..但是现在,它似乎有效。

我做了什么:我实现了自己的类" 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));

            }
        }
    }

也许这有助于其他人;)