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

以编程方式访问Silverlight静态资源,silverlight,xaml,Silverlight,Xaml,我希望像在XAML中一样以编程方式访问静态资源: <TextBlock Text="{Binding Source={StaticResource My.Text.Key}}" /> 无论我的静态资源是在TextBlock、某个父元素(例如UserControl)甚至是应用程序上定义的,这都是有效的。似乎要么StaticResource绑定表达式知道如何遍历元素树,要么元素本身知道。我想以编程的方式做同样的事情: <UserControl x:Class="MyCusto

我希望像在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!
    }
}

公共部分类MyCustomControl
{
公共MyCustomControl()
{
初始化组件();
字符串myCustomValue=this.Resources[myCustomValue]作为字符串;//myCustomValue变为null!
}
}

即使在这个简单的测试中,我的资源似乎也无法通过编程方式访问。这是我试图真正做的事情的简化版本:通过附加了自定义动态属性的元素(例如uiElement.Resources[key])查找静态资源。

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

不过,使用
{StaticResource MyName}
标记扩展和尝试以编程方式查找资源之间有很大的区别

标记扩展导致XamlParser查找指定的键,即被分配的属性所属的
FrameworkElement
Resources
属性。如果未找到该键,它将在父级
框架元素
中查找它,并一直运行,直到它到达根
框架元素
。如果仍然找不到,则查看应用程序的Resources属性

另一方面,该代码:-

string myCustomValue = this.Resources[MyCustomValue] as string;
sf只是在单个资源属性中查找用户控件。未尝试在祖先或应用程序资源中查找密钥。这是一个简单的字典查找。我怀疑这才是真正让你绊倒的原因


话虽如此,我认为在资源密钥中使用“.”可能不是一个好主意。“.”在各种XAML场景中已经有了意义,因此在键名中使用它也可能会让阅读代码的开发人员感到困惑,尽管Silverlight对此非常满意。

当我从键中取出“点”时(例如,“MyTestKey”而不是“my.Test.key”,我可以开始以编程方式查看我的资源。是否有关于在XAML或代码隐藏中命名资源的规则?您的答案是我一直在寻找的直接答案:XAML解析时间资源外观是层次结构的,而程序性资源访问不是。我确实希望XAML解析器使用的层次结构逻辑公开用于编程不过也要使用。我也不认为点是个问题。点确实给ReSharper带来了问题:它会混淆其语法突出显示。我使用点的目的是更好地将资源划分为伪名称空间,以便我的每个Prism模块都可以定义资源,而不会与其他模块发生冲突。