将Image.Source设置为Xamarin.Forms

时间:2016-06-11 11:49:42

标签: xamarin xamarin.forms

我在外部存储中有一个项目的图片(在我的应用程序中被意图保存)。我想在我的共享项目的Image视图中显示这张图片。

Image.Source获取ImageSource类型的对象。我尝试了ImageSource.FromFileImageSource.FromStream甚至是ImageSource.FromUri。结果始终是不显示图像(没有错误或异常)。我首先用File.Open上面的一行打开它来验证文件的路径是否正确。

从正常存储中显示图片的正确方法是什么,而不是从资产/资源/等?

此代码不起作用

var path = "/storage/emulated/0/Pictures/6afbd8c6-bb1e-49d3-838c-0fa809e97cf1.jpg" //in real app the path is taken from DB
var image = new Image() {Aspect = Aspect.AspectFit, WidthRequest = 200, HeightRequest = 200};
image.Source = ImageSource.FromFile(path);

1 个答案:

答案 0 :(得分:4)

你的Xamarin Forms PCL不知道它的Android是什么,因为它特定于平台,所以:

ImageSource.FromFile(path);

无效。

在这种情况下,您正在处理特定于平台的功能,即从Android加载图像。 我建议采用这种方法:

在Xamarin Forms PCL上创建一个界面,如:

public interface IPhoto
{
    Task<Stream> GetPhoto ();
}

然后在Android中,您实现该接口并在DependencyService中注册实现:

[assembly: Xamarin.Forms.Dependency(typeof(PhotoImplementation))]
    namespace xpto
    {
        public class PhotoImplementation : Java.Lang.Object, IPhoto
        {
            public async Task<Stream> GetPhoto()
            {
                // Open the photo and put it in a Stream to return       
                var memoryStream = new MemoryStream();

                using (var source = System.IO.File.OpenRead(path))
                {
                    await source.CopyToAsync(memoryStream);
                }

                return memoryStream;
            }
        }
    }

在Xamarin Forms PCL代码中获取图像:

var image = ImageSource.FromStream ( () => await DependencyService.Get<IPhoto>().GetPhoto());

有关详细信息,请参阅this

注意1:如果您也实现了IPhoto接口,这将适用于iOS。

注意2:Xamarin-Forms-Labs中存在一个名为Camera的此类功能的有用库。

更新(共享项目解决方案)

根据评论中的要求,要在共享项目中使用它而不是PCL,我们可以这样做。

1 - 将IPhotoInterface放入共享项目中。

2 - 在Android / iOS项目中实现界面:

public class PhotoImplementation : IPhoto
{
    public async Task<Stream> GetPhoto()
    {
        // Open the photo and put it in a Stream to return. 
    }
}

3 - 在共享项目中使用它:

IPhoto iPhotoImplementation;

#if __ANDROID__
iPhotoImplementation = new shared_native.Droid.GetPicture();

#elif __IOS__
iPhotoImplementation = new shared_native.iOS.GetPicture();

#endif

var image = ImageSource.FromStream ( () => await iPhotoImplementation.GetPhoto());

注意:shared_native是我的解决方案的命名空间,Droid/iOS是适用于Android和iOS的项目。