Xamarin.Forms ImageCell绑定到本地文件

时间:2016-05-11 23:49:25

标签: xamarin.forms

我在ListView中使用数据绑定来绑定ImageCells列表。该图像是作为app数据存储在设备本地的文件。

在Windows上,使用文件的绝对或相对路径不起作用,我必须将其转换为file:// URI。不幸的是,在Android上,file:// URI不起作用,它需要是一个路径。

我目前正在解决此问题,方法是在视图模型中使用不同的值,具体取决于目标平台。有没有比这更好的解决方案:

if (Device.OS == TargetPlatform.Windows) {
    result.uri = new Uri(uri).AbsoluteUri;
}

的Xaml:

<ListView.ItemTemplate>
  <DataTemplate>
    <ImageCell ImageSource="{Binding Uri}"
               Text="{Binding Name}">
    </ImageCell>
  </DataTemplate>
</ListView.ItemTemplate>  

Uri的类型是字符串,我是否需要使用UriImageSource

1 个答案:

答案 0 :(得分:1)

我通过创建转换器和依赖服务来解决它。

<强>的Xaml

  <ContentPage.Content>
<StackLayout VerticalOptions="FillAndExpand" Padding="5,20,5,0" >
  <ListView x:Name="list" ItemsSource="{Binding MyList}">
    <ListView.ItemTemplate>
      <DataTemplate>
        <ImageCell Text="{Binding Name}" ImageSource="{Binding ImagePath, Converter={StaticResource AndroidImageInvert}}">
        </ImageCell>
      </DataTemplate>
    </ListView.ItemTemplate>
  </ListView>
</StackLayout>

<强>转换器

public class ByteImageConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {

        string fileName = value as string;
        return ImageSource.FromStream(() => new MemoryStream(DependencyService.Get<IWRDependencyService>().GetImageBytes(fileName)));
    }

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

依赖服务

    public byte[] GetImageBytes(string fileName)
    {
        fileName = fileName.Replace(".jpg", "").Replace(".png", "");

        var resId = Forms.Context.Resources.GetIdentifier(
          fileName.ToLower(), "drawable", Forms.Context.PackageName);


        var icon = BitmapFactory.DecodeResource(Forms.Context.Resources, resId);

        var ms = new MemoryStream();

        icon.Compress(Bitmap.CompressFormat.Png, 0, ms);
        byte[] bitmapData = ms.ToArray();
        return bitmapData;
    }