WPF:实现自定义标记扩展
标记扩展使用{标记扩展类 参数}语法,如:
<TextBlock Text={x:Null}/>
为什么x:Null就可以返回一个null值呢?
其实在System.Windows.Markup命名空间中存在一个名为“NullExtension”的类型。
在解析到x:Null的时候,实际上会实例化NullExtension的一个对象。
而NullExtension实现了抽象类MarkupExtension,MarkupExtension中提供了抽象方法:
public abstract object ProvideValue(IServiceProvider serviceProvider);
也就是说,NullExtension在实现抽象类的ProvideValue方法时,返回了一个Null而已,所以x:Null在运行时可以代表一个null值。
下面,假设有这样一个需求:实现一个标记扩展类StringExtension,这个扩展类接受一个int参数,然后返回一个string对象。
可以如下实现:
public class StringExtension:MarkupExtension { private int n; public StringExtension(int n) { this.n = n; } public override object ProvideValue(IServiceProvider serviceProvider) { return n.ToString(); } }
使用方法如下:(假设StringExtension存在于项目根目录下)
<TextBlock Text="{local:String 1}" />
也可以写为:
<TextBlock Text="{local:StringExtension 1}" />
这只是xaml中一个语法糖而已。
运行效果:
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步