我正在使用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();
}
}
答案 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