如何获取WPF中XAML为控件属性赋值所用的资源键?
获取WPF控件属性绑定的静态资源键
WPF默认不会保留StaticResource绑定的资源键信息,直接从控件属性里拿不到对应的键,但可以通过以下几种方式实现需求:
方法一:自定义附加属性存储资源键
这是最直接可控的方案,自己定义一个附加属性来记录资源键,XAML里设置属性时同步赋值:
1. 定义附加属性类
public static class ResourceKeyTracker { public static readonly DependencyProperty TextResourceKeyProperty = DependencyProperty.RegisterAttached( "TextResourceKey", typeof(string), typeof(ResourceKeyTracker), new PropertyMetadata(null)); public static void SetTextResourceKey(DependencyObject element, string value) { element.SetValue(TextResourceKeyProperty, value); } public static string GetTextResourceKey(DependencyObject element) { return (string)element.GetValue(TextResourceKeyProperty); } }
2. 修改XAML设置附加属性
<TextBlock x:Name="myTextBlock" Text="{StaticResource Greeting}" local:ResourceKeyTracker.TextResourceKey="Greeting" />
3. 后台获取资源键
private void OnLoaded(object sender, RoutedEventArgs e) { string resourceKey = ResourceKeyTracker.GetTextResourceKey(myTextBlock); // resourceKey 即为 "Greeting" }
方法二:改用DynamicResource并利用内置属性
如果可以把StaticResource换成DynamicResource,就能直接通过内置属性获取键:
修改XAML
<TextBlock x:Name="myTextBlock" Text="{DynamicResource Greeting}" />
后台获取
private void OnLoaded(object sender, RoutedEventArgs e) { object resourceKey = myTextBlock.GetValue(TextBlock.TextProperty); if (resourceKey is ResourceReferenceExpression resourceRef) { string key = resourceRef.ResourceKey.ToString(); // key 即为 "Greeting" } }
注意:此方法仅适用于
DynamicResource,StaticResource在编译后会直接替换为资源值,不会保留引用关系。
方法三:解析XAML文件(不推荐)
可以通过读取XAML文件内容、解析控件属性绑定来获取资源键,但这种方法需要处理文件路径、XAML解析逻辑,还要匹配控件实例,复杂度高且易出错,非特殊场景不建议使用。
内容的提问来源于stack exchange,提问作者Dan Stevens
相关产品推荐
相关产品推荐

