首页 > 解决方案 > 使 MarkupExtension 与热重载 (Xamarin) 一起工作

问题描述

标题说得最多。我有一个自定义 MarkupExtension,它从字体中获取具有提供名称的图标并将其作为 FontImageSource 返回。该扩展可以在任何可以使用 ImageSource 的地方使用。扩展本身工作得很好。唯一的问题是当我使用热重载时,在我的页面上做一些更改并通过保存更改来重新加载视图,所有使用我的扩展的控件(例如图像)都是空白的。

有什么方法可以让我的 MarkupExtension 与 Hot Reload 一起工作?

示例代码:

[ContentProperty(nameof(IconName))]
public class FontImageExtension : IMarkupExtension<ImageSource>
{
    private readonly IconFontService iconFontService;

    public string IconName { get; set; }

    public FontImageExtension()
    {
        iconFontService = GetService();
    }

    public ImageSource ProvideValue(IServiceProvider serviceProvider)
    {
        if (string.IsNullOrEmpty(IconName))
            return null;

        string glyphCode = iconFontService.GetGlyphCode(IconName);

        if (string.IsNullOrEmpty(glyphCode))
            return null;

        return new FontImageSource()
        {
            FontFamily = iconFontService.GetFontLocation(),
            Glyph = glyphCode,
        };
    }

    object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
    {
        // Converting back is not needed
        return null;
    }
}

标签: c#xamlxamarinxamarin.formsmarkup-extensions

解决方案


哦,哇,我是有史以来最愚蠢的人。该函数IMarkupExtension.ProvideValue不是为了提供将 ImageSource 转换回任何内容的方法(不知道为什么我认为它会这样做)。这似乎是在热重载时调用的函数。

因此,答案就像更改IMarkupExtension.ProvideValue为以下内容一样简单:

object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
{
    return ProvideValue(serviceProvider);
}

推荐阅读