如何在XAML中访问外部资源字典内资源对象的属性
你之前的写法不生效是因为StaticResource标记扩展本身没有Path属性,它只能直接返回资源对应的完整对象,不能直接截取属性值,你可以用以下两种方案实现需求:
方案1:使用Binding封装StaticResource(无需额外代码)
你可以用 Binding 扩展来桥接,将StaticResource作为Binding的数据源,再指定Path访问Color属性:
<MyObject> <MyObject.Colors> <Binding Source="{StaticResource Foo}" Path="Color" /> <Binding Source="{StaticResource Bar}" Path="Color" /> </MyObject.Colors> </MyObject>
适用场景:MyObject.Colors是依赖属性,或者集合支持绑定值注入的场景,是开发中最常用的低成本方案。
方案2:自定义标记扩展(全场景兼容)
如果你要填充的是普通CLR集合、不需要依赖绑定上下文,可以自己实现一个支持属性路径的资源访问标记扩展:
首先在后端实现扩展类:
using System; using System.Windows; using System.Windows.Markup; [MarkupExtensionReturnType(typeof(object))] public class GetResourcePropertyExtension : MarkupExtension { // 资源Key public string Key { get; set; } // 要访问的属性路径 public PropertyPath Path { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { // 全局查找资源,你也可以根据自己的需求调整资源查找范围 object resource = Application.Current.TryFindResource(Key); if (resource == null || Path == null) return resource; // 解析属性路径获取对应值 return Path.Evaluate(resource); } }
然后在XAML中引入你的项目命名空间(假设命名空间前缀为local)后直接使用:
<MyObject> <MyObject.Colors> <local:GetResourceProperty Key="Foo" Path="Color" /> <local:GetResourceProperty Key="Bar" Path="Color" /> </MyObject.Colors> </MyObject>
适用场景:所有场景,兼容性最好,还可以根据需求扩展支持动态资源、多级属性路径等能力。
内容的提问来源于stack exchange,提问作者Nostromo
相关产品推荐
相关产品推荐

