mvvmcross图像资源加载扩展要求

时间:2014-05-26 12:20:08

标签: android ios mvvmcross

我正在使用MvxImage小部件(Android中的axml)& UIImage + MvxImageLoader(iOS)使用resourceLoader插件从本地资源动态加载UI图像。这些绑定到viewmodel中的字符串,指示要加载的图像。绑定工作正常。 Viewmodel图像名称字符串使用res:前缀使其工作。

当在绑定字符串中省略文件扩展名(.png)但在添加.png或.jpg时找不到资源时,这在Android上运行正常。

示例axml:

<Mvx.MvxImageView
local:MvxBind="ImageUrl ImgWifiStatus"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView1"
android:scaleType="fitEnd"
android:layout_marginBottom="5dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:layout_marginRight="5dp" />

在iOS上,它恰恰相反。在绑定字符串中没有.png扩展名的资源中找不到图像。

_wifiImgViewLoader = new MvxImageViewLoader(() => this.wifiImg);
set.Bind(_wifiImgViewLoader).To(vm => vm.ImgWifiStatus);

有没有办法在两个平台上以类似的方式工作,或者我必须在iOS上使用valueconvertor将扩展名添加到没有扩展名的绑定文件名字符串。

由于

修改

这是诀窍的价值转换者。漂亮的straithforward。我正在同时使用它来制作所有小写文件名,并允许在如何指定所需扩展名方面提供一些灵活性。

public class AddFileExtensionValueConverter : MvxValueConverter<string, string>
{
    protected override string Convert(string value, Type targetType, object parameter, CultureInfo culture)
    {
        value = value ??  "";
        parameter = parameter ?? "";
        switch ((string) parameter)
        {
            case "PNG":
            case "png":
            case ".PNG":
            case ".png":
                return value.ToLower()  + ".png";
                break;
            case "JPG":
            case "jpg":
            case ".jpg":
            case ".JPG":
                return value.ToLower()  + ".jpg";
                break;
            case "GIF":
            case "gif":
            case ".gig":
            case ".GIF":
                return value.ToLower()  + ".gif";
                break;
        }
        return value.ToLower();
    }
}

2 个答案:

答案 0 :(得分:2)

我认为没有办法绕过这个问题= /。目前的解决方案是使用ValueConverters。 这里有一个带转换器的类似帖子:How to bind imageSource to ImageView in MvvmCross

希望有帮助=)

答案 1 :(得分:0)

如果您在源代码中使用了文件扩展名,那么您可以注册自定义IMvxLocalFileImageLoader<Bitmap>实施来加载您的Android资源。

您可以将您的实施基础MyAndroidLocalFileImageLoader - 基于:https://github.com/MvvmCross/MvvmCross/blob/v3.1/Plugins/Cirrious/DownloadCache/Cirrious.MvvmCross.Plugins.DownloadCache.Droid/MvxAndroidLocalFileImageLoader.cs

你可以改变:

            var resourcePath = localPath.Substring(ResourcePrefix.Length);
            bitmap = LoadResourceBitmap(resourcePath);

为:

            var resourcePath = localPath
                                  .Substring(ResourcePrefix.Length)
                                  .ToLower()
                                  .Replace(".jpg", "")
                                  .Replace(".png", "");
            bitmap = LoadResourceBitmap(resourcePath);

然后,您可以在MyAndroidLocalFileImageLoader

中的设置中注册自定义InitializeLastChance