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