我尝试将imageview与本地图像文件绑定。在android中,我可以使用setImageUrl从资源文件夹外的文件中设置图像。我阅读了N + 1小猫示例,并尝试使用文件URL而不是web url作为我的项目。 图像视图的布局
<Mvx.MvxImageView
android:id="@+id/advisor_message_picture"
android:layout_width="64dp"
android:layout_height="64dp"
android:layout_marginLeft="8dp"
android:layout_alignParentRight="true"
local:MvxBind="ImageUrl MessageImage, Converter = Image" />
转换器用于连接文件名和文件目录url。 Android视图文件将设置FileDir
public class ImageConverter : MvxValueConverter<string, string>
{
public static string FileDir;
protected override string Convert(string value, Type targetType, object parameter, CultureInfo culture)
{
return FileDir + "/" + value;
}
}
答案后更新
我首先将文件复制或下载到Context.FilesDir.Path并使用SetImageUrl进行检查,图像显示出来。
view.FindViewById<ImageView>(Resource.Id.advisor_message_picture).SetImageURI( new FileService(_context).CopyFileFromAssetsToStorage("image.png"));
然后我使用相同的路径和文件名
设置转换器的FileUrlImageConverter.FileDir = FilesDir.Path;
在ViewModel中
_messageImage = "image.png";
private string _messageImage;
public string MessageImage
{
get { return _messageImage; }
set { _messageImage = value; RaisePropertyChanged(() => MessageImage); }
}
现在有效。问题是我误解了viewmodel的绑定时间
答案 0 :(得分:1)
对于Asset,您可以使用ResourceLoader插件使用AssetImagePath
进行绑定。但是,由于粘手指编辑错误,此自定义绑定当前需要添加到您的安装程序 - 有关错误详细信息,请参阅https://github.com/slodge/MvvmCross/issues/372
对于使用文件插件存储的文件(默认为Context.FilesDir.Path
- 请参阅https://github.com/slodge/MvvmCross/blob/v3/Plugins/Cirrious/File/Cirrious.MvvmCross.Plugins.File.Droid/MvxAndroidFileStore.cs#L39),您可以直接使用路径。
对于存储在应用中确定的某些自定义FileDir
中的文件,您需要提供相对于Context.FilesDir.Path
的路径,以便插件加载它。
为了进一步调试,您可以添加断点或跟踪到https://github.com/slodge/MvvmCross/blob/v3/Plugins/Cirrious/DownloadCache/Cirrious.MvvmCross.Plugins.DownloadCache.Droid/MvxAndroidLocalFileImageLoader.cs#L28 - 或者您可以构建并注册自己的IMvxLocalFileImageLoader<Bitmap>
实现,该实现了解您的文件路径。