2017-07-14 103 views
1

图片我想在我的解决方案上传共享项目内部的图像,使得Android和iOS的项目可以通过XAML中正常使用。不工作,我不知道为什么。任何人都可以解释为什么它不工作?Xamarin形式共享项目,Android和iOS

扩展:

[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作为文档指示。

+0

你能展示你的项目结构吗?这张图片的位置在哪里?它是共享项目中的资产文件夹吗? –

+0

如果你不需要基于设备的不同尺寸的图像,我建议你使用嵌入式图像。如果您需要不同的尺寸,则需要使用项目特定的文件夹。请在这里更好地阅读并提出您的问题。 https://developer.xamarin.com/guides/xamarin-forms/user-interface/images/ – batmaci

回答

2

FromResource被参照Android或iOS项目不是共享一个。这些图像需要位于平台特定项目的相应文件夹中。

+0

好的,但是使用共享的正确方法是什么? –

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

关键是要添加到您的PCL你在哪里打电话FromResource您的共享项目的参考。共享的项目被注入到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”

+0

@LuizNegrini没有为你工作? –