我已经为ImageSource
创建了一个IMarkupExtension
,它从指定的字体中获取指定的符号,并以指定的颜色和指定的高度显示它。大多数情况下,图标名称是静态的,我直接写入XAML。但是有时候会有一些东西的列表,这些东西有一个属性来决定应该使用哪个图标。在这种情况下,图标名称必须是可绑定的。
以下是(或多或少)我的FontImageExtension
的当前状态:
[ContentProperty(nameof(IconName))]
public class FontImageExtension : IMarkupExtension<ImageSource>
{
private readonly IconFontService iconFontService;
[TypeConverter(typeof(FontSizeConverter))]
public double Size { get; set; } = 30d;
public string IconName { get; set; }
public Color Color { get; set; }
public string FontFamily { get; set; }
public FontImageExtension()
{
iconFontService = SomeKindOfContainer.Resolve<IconFontService>();
}
public ImageSource ProvideValue(IServiceProvider serviceProvider)
{
if (string.IsNullOrEmpty(IconName))
return null;
IconFont iconFont = iconFontService.GetIconFont();
if (iconFont == null)
return null;
string glyphCode = iconFont.GetGlyphCode(IconName);
if (string.IsNullOrEmpty(glyphCode))
return null;
FontImageSource fontImageSource = new FontImageSource()
{
FontFamily = iconFont.GetPlatformLocation(),
Glyph = glyphCode,
Color = this.Color,
Size = this.Size,
};
return fontImageSource;
}
object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
return ProvideValue(serviceProvider);
}
}
大多数时候,我在XAML中使用它(它已经完美地工作了):
<Image Source="{m:FontImage SomeIcon, Color=Black, Size=48}"/>
但是对于动态UI(例如列表或其他东西)我需要这样的:
<CollectionView ItemsSource={Binding SomeCollection}">
<CollectionView.ItemTemplate>
<StackLayout>
<Image Source="{m:FontImage IconName={Binding ItemIcon}, Color=Black, Size=48}"/>
<Label Text="{Binding ItemText}"/>
</StackLayout>
</CollectionView.ItemTemplate>
</CollectionView>
我该怎么做?
3条答案
按热度按时间wbgh16ku1#
似乎你不能使用
IMarkupExtension
与bindableproperties.作为一个'绑定'只能设置在BindableObject的BindableProperty.问题是MarkupExtension类不派生BindableObject,这就是为什么它是不可能设置绑定在它的属性.虽然你让它实现BindableObject,它仍然无法工作.解决方法是使用Value Converters。
举例来说:
在你的xaml中使用:
另请参见失败的尝试声明BindableProperty:IMarkupExtension with bindable property does not work和一个更雄心勃勃的方法来处理稍微不同的情况-可能是相关的:用于绑定的MarkupExtension。
ev7lccsx2#
我通过创建一个转换器解决了这个问题(就像@Leo Zhu建议的那样),但除了
IMarkupExtension
之外。因此,我的扩展保持原样(添加了一个在转换器中使用的常量值),转换器的代码如下:然后可以像这样使用它:
对于静态值,它保持如下:
2ul0zpep3#
实际上,您可以让
FontImageExtension
标记扩展同时实现(1)BindableObject
,(2)IMarkupExtension
和IMultiValueConverter
: