跨平台图像名称?
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}}" />
我有一些 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}}" />