以编程方式访问Silverlight静态资源

时间:2009-11-25 16:13:27

标签: silverlight xaml

我想以编程方式访问静态资源,就像在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])。

1 个答案:

答案 0 :(得分:17)

尽管你发表了相反的评论,我怀疑是否使用“。”在您的资源键中确实是您的问题的根源。在这种情况下“。”没有特殊意义,也不会影响资源的访问方式。 (我已尝试过但未能重现任何问题)。

使用{StaticResource MyName}标记扩展和尝试以编程方式查找资源之间存在很大差异。

标记扩展使XamlParser查找指定的键,该Resources属性被分配的属性所属的FrameworkElement属性。如果找不到密钥,它会在父FrameworkElement中查找它,并且它会一直运行,直到它到达根FrameworkElement。如果仍未找到它,请查看Application的Resources属性。

另一方面,这段代码: -

string myCustomValue = this.Resources[MyCustomValue] as string;

仅仅查看用户控件的单个Resources属性。没有尝试在祖先或应用程序资源中搜索密钥。它是一个简单的字典查找。我怀疑这是真正绊倒你的。

说过我会说使用“。”在资源键中可能不是一个好主意。 “。”在各种XAML场景中确实有意义,因此在键名中使用它也有可能混淆开发人员阅读代码,即使Silverlight对此非常满意。