Xamarin与Android和iOS的图像形成共享项目

时间:2017-07-14 19:24:01

标签: c# xaml xamarin xamarin.android xamarin.forms

我正在尝试在我的解决方案中的共享项目中上传图像,以便Android和iOS项目可以通过Xaml正常使用它。不工作,我不知道为什么。谁能解释为什么它不起作用?

扩展:

[ContentProperty("Source")]
    public class ImageResourceExtension : IMarkupExtension
    {
        public string Source { get; set; }

        public object ProvideValue(IServiceProvider serviceProvider)
        {
            if (Source == null)
            {
                return null;
            }
            // Do your translation lookup here, using whatever method you require
            var imageSource = ImageSource.FromResource(Source);

            return imageSource;
        }
    }

的Xaml:

<Image Source="{extensions:ImageResource MyProject.Assets.fechar.png}" HorizontalOptions="Start" HeightRequest="16" Focused="Image_Focused" BackgroundColor="Red" WidthRequest="15" />

在扩展中放置一个断点,它通常会对我列表中的每个项目进行一次。

我还尝试仅通过代码隐藏来插入硬编码绑定进行测试,并且使用ImageSource.FromResource也无法正常工作。

图像文件与文档所示的EmbbedResource一样。

2 个答案:

答案 0 :(得分:2)

FromResource指的是Android或iOS项目,而不是共享项目。图像需要位于特定于平台的项目的相应文件夹中。

答案 1 :(得分:1)

不要使用扩展名。有更简单的方法。

根据Xamarin“目前没有资源标识符的隐式转换,您必须使用ImageSource.FromResource”和“因为没有从字符串到ResourceImageSource的内置类型转换器,所以这些类型的图像不能由Xaml本地加载”。因此,您无法在xaml中指定您的图像是共享的,但您可以使用后面的代码来绑定共享图像。

在xaml:

<Image Source="{Binding Image}" HorizontalOptions="Start" WidthRequest="80"/>

然后在代码背后

public ImageSource Image
{
    get
    {
        return ImageSource.FromResource("ButtonRendererDemo.Resources.icon1.png"); //from PCL
    }
}

下面是项目结构

enter image description here

/////////////////////////////////////////////// ///////////////////

使用共享项目进行测试。以下是结构

enter image description here

关键是将您的共享项目的引用添加到您调用FromResource的PCL。共享项目被注入PCL 然后在我的项目结构中它是

public ImageSource Image
        {
            get
            {
                //return ImageSource.FromResource("ButtonRendererDemo.Resources.icon1.png"); //from PCL
                return ImageSource.FromResource("ButtonRendererDemo.Pictures.icon1.png"); //from Shared
            }
        }

/////////////////////////////////////////////// ///////////////

如果没有任何作用,请使用以下代码查找您的资源。在使用System.Reflection调用FromResource add的文件中;然后添加以下代码

    var assembly = typeof(App).GetTypeInfo().Assembly;
    foreach (var res in assembly.GetManifestResourceNames())
    {
        System.Diagnostics.Debug.WriteLine("found resource: " + res);
    }

您应该在“输出”窗口中看到类似

的内容

找到资源:someNamespace.Pictures.icon1.png - 这是您需要使用的资源。

您没有回答我关于您的项目结构的问题。然后我可以给你一个确切的答案。我怀疑你的图片路径是“MyProject.Droid.Assets.fechar.png”