跨平台图像名称?

Cross-platform image name?

我有一些 xaml 标记来指定基于绑定的图像文件。

<Image Grid.Row="0" Grid.Column="3" Source="{Binding ImageSource}" VerticalOptions="Center"/>

我的模型 class 有此 return 文件名:

public string ImageSource {
    get {
        return (PaymentType == PaymentType.Check ? "check" : "card");
    }
}

这对 iOS 非常有用,因为文件名为 check.png、check@2x.png 等,并且我的图像正在显示。但是图像没有显示在 Android 上,因为我需要指定 "check.png" 或 "card.png"。在保持严格模型 class 的同时,我怎样才能使它也适用于 Android?

查看文档 here

最简单的方法是像这样使用编译器指令:

public string ImageSource {
   get {
      #if __IOS__
      return (PaymentType == PaymentType.Check ? "check" : "card");
      #endif

      #if __ANDROID__
      return (PaymentType == PaymentType.Check ? "check.png" : "card.png");
      #endif
   }
}

但可能还有更优雅的解决方案。

这可以使用值转换器来实现:

namespace MyApp.ValueConverters
{
    using System;
    using System.Globalization;
    using Xamarin.Forms;

    public class ImageSourceConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value is string)
            {
                switch (Device.OS)
                {
                    case TargetPlatform.Android:
                        return string.Format("{0}.png", value);

                    default:
                        // No conversion for other platforms
                }   
            }
            return value;
        }

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

然后设置任何需要的页面以访问新的 ImageSourceConverter:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:converters="clr-namespace:MyApp.ValueConverters;assembly=MyApp"
         ...>

将转换器指定为页面资源,以便在绑定中使用它:

<ContentPage.Resources>
    <ResourceDictionary>
        ...
        <converters:ImageSourceConverter x:Key="MyImageSourceConverter" />
    </ResourceDictionary>
</ContentPage.Resources>

最后,更新任何图像源绑定以使用转换器:

<Image Grid.Row="0" Grid.Column="3" VerticalOptions="Center" 
    Source="{Binding ImageSource, Converter={StaticResource MyImageSourceConverter}}" />