【问题标题】:Binding Image URIs via Image.SetBinding() not working properly通过 Image.SetBinding() 绑定图像 URI 无法正常工作
【发布时间】:2023-04-07 15:02:02
【问题描述】:

我正在使用以下代码 sn-p 将图像 url 绑定到图像对象(用作 ViewCell 对象中的一个元素)。

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

   ...

列表中的图像(我正在使用该单元格视图)并不总是加载。我无法确定问题的确切原因,但我认为问题在于加载过程(用于从 url/internet 加载图像)..

也许问题可以通过按照文档中的描述通过 new Uri(...) 设置 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 studio(版本 6.1.2,内部版本 44,更新频道“beta”,os x)。

如果有人给小费就好了。

非常感谢,

亚历克斯

【问题讨论】:

  • 为什么 ImageSource.FromUri 对您不起作用,如文档中所述?
  • 嗨,一旦我尝试绑定“uri”值,我就会收到消息:错误 CS1929:类型 Xamarin.Forms.Image' does not contain a member SetBinding' 和最佳扩展方法重载 Xamarin.Forms.TemplateExtensions.SetBinding(this Xamarin.Forms.DataTemplate, Xamarin.Forms.BindableProperty, string)' requires an instance of type Xamarin.Forms .DataTemplate' (CS1929)

标签: forms image xamarin uri


【解决方案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); }
            }

        }

此外,我使用自定义渲染器调整了渲染过程。如文档中所述,我正在通过 new 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));

            }
        }
    }

也许这对其他人有帮助;)

【讨论】:

    猜你喜欢
    • 2020-08-02
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 2021-11-08
    • 2017-02-09
    相关资源
    最近更新 更多