C# 使MarkupExtension与热重新加载一起工作(Xamarin)

C# 使MarkupExtension与热重新加载一起工作(Xamarin),c#,xaml,xamarin,xamarin.forms,markup-extensions,C#,Xaml,Xamarin,Xamarin.forms,Markup Extensions,标题最能说明问题。我有一个自定义MarkupExtension,它从字体中获取一个带有提供名称的图标,并将其作为FontImageSource返回。扩展可以在任何可以使用ImageSources的地方使用。 扩展本身工作得很好。唯一的问题是,当我使用热重新加载时,在我的页面上做一些更改,并且通过保存更改来重新加载视图,所有使用我的扩展名的控件(例如图像)都是空白的 有没有办法让我的MarkupExtension使用热重新加载 示例代码: [ContentProperty(nameof(IconN

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

有没有办法让我的MarkupExtension使用热重新加载

示例代码:

[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;
    }
}
[ContentProperty(nameof(IconName))]
公共类FontImageExtension:IMarkupExtension
{
专用只读IContService IContService;
公共字符串IconName{get;set;}
公共FontImageExtension()
{
iconFontService=GetService();
}
公共ImageSource ProviderValue(IServiceProvider服务提供商)
{
if(string.IsNullOrEmpty(IconName))
返回null;
字符串glyphCode=iconFontService.GetGlyphCode(IconName);
if(string.IsNullOrEmpty(glyphCode))
返回null;
返回新的FontImageSource()
{
FontFamily=iconFontService.GetFontLocation(),
字形=字形代码,
};
}
对象IMarkupExtension.ProviderValue(IServiceProvider服务提供者)
{
//不需要重新转换
返回null;
}
}

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

因此,答案很简单,只需更改
IMarkupExtension即可。请为以下内容提供devalue

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

我认为cs文件中的代码不能使用热重新加载热重新加载有一大堆限制,而且在最好的情况下是相当偶然的。这是一个很大的进步,但仍在进行中