Xamarin Forms使用XAML从嵌入式资源显示图像

时间:2018-10-13 14:28:24

标签: xamarin xamarin.forms

我正在尝试在共享项目资源中显示和嵌入图像(如Microsoft文档上的here所述)。

我创建了ImageResourceExtension,项目进行了编译,但是在启动项目时出现以下错误:

  

无法从以下位置加载类型'Xamarin.Forms.Xaml.IReferenceProvider'   程序集'Xamarin.Forms.Core,Version = 2.0.0.0

这是我的代码:

MainPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:App1"
             x:Class="App1.MainPage">

    <StackLayout>

        <Image x:Name="imgTest" Source="{local:ImageResource img.jpg}" />

    </StackLayout>

</ContentPage>

EmbeddedImage.cs

namespace App1
{
    [ContentProperty(nameof(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, typeof(ImageResourceExtension).GetTypeInfo().Assembly);

            return imageSource;
        }
    }
}

4 个答案:

答案 0 :(得分:0)

如果将Image添加到Android drawable文件夹或iOS Resource文件夹,则不需要任何扩展名。您可以简单地做到:

private Person extractUserFromResultSet(ResultSet rs) throws SQLException { 

    // add this line below
    Person person = new Person();

    person.setId(rs.getInt("ID"));
    person.setFName(rs.getString("FName")); 
    person.setLName(rs.getString("LName")); 
    person.setDOB(rs.getString("DOB")); 
    person.setDepartment(rs.getString("Department")); 
    person.setLocation(rs.getString("Location")); 
    person.setCellNr(rs.getString("Cellnr")); 
    person.setUsername(rs.getString("Username")); 
    person.setPassword(rs.getString("Password"));
    return person;
}

答案 1 :(得分:0)

不知道答案是否仍然对您有效,但是我通常在解决方案之外有一个Assets文件夹,其中包含Android特定的文件夹(可绘制对象),iOS特定的文件夹(带有@ 2x和@ 3x的资源)和一个用于共享的图片。

在我的解决方案中,我将这些文件作为链接添加在应与之关联的文件夹中。在Android上的Resources / Drawable中,在iOS上的Resource中。在这种情况下,可以在两个平台之间共享公用文件,而无需实际复制它们。

作为奖励,这些资产的更新可以在我的解决方案外部的文件夹中覆盖,并且可以在我的解决方案内使用,而无需执行任何其他操作。

答案 2 :(得分:0)

您可以尝试一下,它对我有用

xyz.xaml.cs

imgName.Source = ImageSource.FromResource("ProjectName.Images.backicon.png");

xyz.xaml

<Image x:Name="imgName" />

希望此代码对您有帮助!

答案 3 :(得分:0)

替换:

<Image x:Name="imgTest" Source="{local:ImageResource img.jpg}" />

使用:

<Image x:Name="imgTest" Source="{local:ImageResource 'Project.Folder.img.jpg'}" />

然后替换:

var imageSource = ImageSource.FromResource(Source, typeof(...));

使用:

var imageSource = ImageSource.FromResource(Source);