如何在C#中从对象获取资源键?WPF XAML编辑场景需求
刚好做过类似的场景,要在属性栏里清晰展示按钮Content的资源引用信息和实际生效值,你可以按下面的思路来实现:
1. 提取DynamicResource的引用键
当你通过XamlReader.Load加载XAML后,按钮的Content属性并没有直接存储资源的实际值,而是绑定了一个DynamicResourceExtension对象。要拿到用户设置的资源引用,你需要读取这个表达式对象:
// 先找到加载后的按钮(假设你的Grid已经被实例化为loadedGrid) var targetButton = loadedGrid.Children.OfType<Button>().FirstOrDefault(); if (targetButton == null) return; // 获取属性的源信息,确认是本地设置的DynamicResource var valueSource = DependencyPropertyHelper.GetValueSource(targetButton, Button.ContentProperty); if (valueSource.BaseValueSource == BaseValueSource.Local) { var dynamicResourceExpr = targetButton.ReadLocalValue(Button.ContentProperty) as DynamicResourceExtension; if (dynamicResourceExpr != null) { // 这里就是用户在XAML里写的资源键,比如"resource1" string resourceReference = $"引用资源: {dynamicResourceExpr.ResourceKey}"; // 把这个字符串显示到属性栏对应的位置 } }
2. 获取实际生效的Content值
要展示按钮当前实际显示的内容,直接访问targetButton.Content就可以,但要处理资源找不到的情况:
object actualContentValue = targetButton.Content; string actualDisplayText = actualContentValue != null ? actualContentValue.ToString() : "⚠️ 资源未找到"; // 在属性栏里显示实际值,比如"当前值: {actualDisplayText}"
3. 整合显示逻辑
建议在属性栏里把两种信息结合起来展示,比如:
- 如果是DynamicResource绑定:显示
*引用资源: resource1 | 当前值: [实际内容]* - 如果后续用户把Content改成了直接文本(比如输入"点击我"):则只显示
*当前值: 点击我*
4. 实时更新资源变化
因为DynamicResource是动态的,当资源字典里的resource1值变化时,按钮的Content也会跟着变。如果要让属性栏实时同步更新,可以注册属性变化回调:
targetButton.RegisterPropertyChangedCallback(Button.ContentProperty, (sender, args) => { var btn = sender as Button; if (btn == null) return; // 重新执行上面的步骤1和2,更新属性栏的显示内容 });
这样就能在属性栏里准确告知用户当前按钮Content的状态啦~
内容的提问来源于stack exchange,提问作者thirking
相关产品推荐
相关产品推荐

