1

我尝试将 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"));

然后我使用相同的路径和文件名设置转换器的 FileUrl

ImageConverter.FileDir = FilesDir.Path;

在视图模型中

_messageImage = "image.png";
private string _messageImage;
public string MessageImage
{
     get { return _messageImage; }
     set { _messageImage = value; RaisePropertyChanged(() => MessageImage); }
}

现在可以了。问题是我误解了viewmodel的绑定时间

4

1 回答 1

1

对于资产,您可以AssetImagePath使用 ResourceLoader 插件进行绑定。但是,由于粘手指编辑错误,此自定义绑定当前确实需要添加到您的设置中 -有关错误详细信息,请参阅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>了解您的文件路径的实现。

于 2013-07-30T20:04:46.947 回答