xamarin形式:将图像加载到图像控件

时间:2018-02-08 04:38:09

标签: android ios image xamarin

如何使用PCLStorage将图像文件从iOS或Android加载到使用ImageSource的图像控件。

public string GetMediaFilePath(int orgId, string folderName, string filename)
    {
        var storage_root = FileSystem.Current.LocalStorage.Path;
        var rootFolderName = string.Format(ROOT_PREFIX, orgId);
        var path = string.Format("{0}/{1}/{2}", storage_root, rootFolderName, filename);
        return path; }

<controls:CircleImage 
        Grid.Row="0"
         Grid.Column="0"
         Style="{StaticResource profileImageStyle}" 
          Source="{Binding Source}" 
          VerticalOptions="Center"
          HorizontalOptions="Center"> 
</controls:CircleImage>

public ImageSource Source 
        {
            get 
            {
                var file = new MediaLogic().GetMediaFilePath(Model.OrgId, MediaLogic.PROFILE_IMAGE_FOLDER, Model.ProfileImage);
                return "file:///"+file;
            }
        }

我尝试删除file:///并使用ImageSource.FromFile或FromUri,但它们都没有显示图像。

2 个答案:

答案 0 :(得分:0)

PCLStorage有IFile.OpenAsync(),它将返回一个流。

Stream stream = await file.OpenAsync(FileAccess.Read);
image.Source = ImageSource.FromStream(() => stream);

答案 1 :(得分:0)

如果您想使用bind加载图片源,则应使用转换器

首先创建一个转换器,如:

public class ImageFileToImageSourceConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var path = (string)value;
        return ImageSource.FromFile(path);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后你可以在你的XAML中使用它:

<controls:CircleImage 
        Grid.Row="0"
        Grid.Column="0"
        Style="{StaticResource profileImageStyle}" 
        Source="{Binding Source, Converter={StaticResource ImageFileToImageSourceConverter}}" 
        VerticalOptions="Center"
        HorizontalOptions="Center"> 
</controls:CircleImage>

此处还有dataSource类:

public class FileSource
{
    public string Source
    {
        get
        {
            var file = new MediaLogic().GetMediaFilePath(Model.OrgId, MediaLogic.PROFILE_IMAGE_FOLDER, Model.ProfileImage);
            return file;
        }
    }
}

最后不要忘记将BindingContext设置为此课程:MyStackLayout.BindingContext = new FileSource();