Я предполагаю, что Media.logo-pp.png
является одним из 3 изображений, которые вы хотите показать.Вы можете использовать следующий прием, чтобы избежать дублирования шаблонов:
Прежде всего создайте конвертер, который преобразует имя вкладки в целевое изображение.
public class TabToImageConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string imageName;
switch (value.ToString())
{
case "1":
imageName= "logo-pp.png"
break;
case "2":
imageName= "logo-pp2.png"
break;
case "3":
imageName= "logo-pp3.png"
break;
default:
imageName= "logo-pp.png"
break;
}
return ImageSource.FromResource($"Media.{imageName}", this.GetType().GetTypeInfo().Assembly);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Затем измените определение шаблона следующим образом:
- добавьте новое пространство имен для вашего класса конвертера:
xmlns:converters="clr-namespace:Metadia.Converters"
добавить статический ресурс и ссылаться на приведенный выше конвертер
<ResourceDictionary>
<converters:TabToImageConverter x:Key="TabToImage" />
добавить имя к метке, чтобы на него можно было сослаться
добавить привязку к источнику изображения с помощью свойства Text
метки и конвертера
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Image Source="{TemplateBinding Source={x:Reference tabTitle}, Path=Text, Converter={StaticResource {TabToImage}}" Grid.Row="0" WidthRequest="25" />
<Label x:Name="tabTitle" Grid.Row="1" Text="{TemplateBinding Text}" HorizontalTextAlignment="Center" StyleClass="tabViewHeaderTextColor"/>
<BoxView Grid.Row="2" IsVisible="{TemplateBinding IsSelected}"
StyleClass="tabViewHeaderBgColor"
HorizontalOptions="Fill"
HeightRequest="2" />
</Grid>
Et voilà!
Обратите внимание, что если вы переименуете изображения так же, как текст вкладок, конвертер может просто вернуть (если не ноль):
return ImageSource.FromResource($"Media.{value.ToString()}", this.GetType().GetTypeInfo().Assembly);
Надеюсь, это поможет и удачного кодирования!