我想以编程方式访问静态资源,就像在XAML中一样:
<TextBlock Text="{Binding Source={StaticResource My.Text.Key}}" />
无论我的静态资源是在TextBlock,某些父元素(例如UserControl)还是应用程序上定义的,这都有效。似乎StaticResource绑定表达式知道如何向上走元素树,或者元素本身如何。我想以编程方式做同样的事情:
<UserControl x:Class="MyCustomControl" ...>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Resources.xaml"/> <!-- Sets 'My.Text.Key' to System.String 'Hello, World!' -->
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
</UserControl>
public partial class MyCustomControl
{
public MyCustomControl()
{
InitializeComponent();
string myCustomValue = this.Resources[MyCustomValue] as string; // myCustomValue becomes null!
}
}
即使在这个简单的测试中,似乎也无法以编程方式访问我的资源。这是我尝试真正做的简化版本:通过附加自定义动态属性的元素找到静态资源(例如uiElement.Resources [key])。
答案 0 :(得分:17)
尽管你发表了相反的评论,我怀疑是否使用“。”在您的资源键中确实是您的问题的根源。在这种情况下“。”没有特殊意义,也不会影响资源的访问方式。 (我已尝试过但未能重现任何问题)。
使用{StaticResource MyName}
标记扩展和尝试以编程方式查找资源之间存在很大差异。
标记扩展使XamlParser查找指定的键,该Resources
属性被分配的属性所属的FrameworkElement
属性。如果找不到密钥,它会在父FrameworkElement
中查找它,并且它会一直运行,直到它到达根FrameworkElement
。如果仍未找到它,请查看Application的Resources属性。
另一方面,这段代码: -
string myCustomValue = this.Resources[MyCustomValue] as string;
仅仅查看用户控件的单个Resources属性。没有尝试在祖先或应用程序资源中搜索密钥。它是一个简单的字典查找。我怀疑这是真正绊倒你的。
说过我会说使用“。”在资源键中可能不是一个好主意。 “。”在各种XAML场景中确实有意义,因此在键名中使用它也有可能混淆开发人员阅读代码,即使Silverlight对此非常满意。