Программный доступ к статическому ресурсу Silverlight

Я хотел бы получить программный доступ к статическим ресурсам так же, как в 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

Несмотря на ваш комментарий об обратном, я сомневаюсь в использовании ".". в вашем ключе ресурса действительно является источником вашей проблемы. В этой ситуации "." не имеет особого значения и не повлияет на доступ к ресурсу. (Я пытался и не смог воспроизвести с ним какие-либо проблемы).

Существует очень большая разница между использованием расширения расширения {StaticResource MyName} и попыткой поиска ресурса программно.

Расширение разметки заставляет XamlParser искать указанный ключ в свойстве Resources объекта FrameworkElement, которому принадлежит присвоенное свойство. Если ключ не найден, он ищет его в родительском FrameworkElement, и он продолжает движение, пока не достигнет корня FrameworkElement. Если он еще не найден, он имеет вид свойства Application Resources.

С другой стороны, этот код: -

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

sf просто ищет одно свойство Resources для пользовательского элемента управления. Не предпринимаются попытки выследить ключ у предков или ресурсов приложения. Его простой поиск словаря. Я подозреваю, это то, что вас действительно трогало.

Сказав, что я бы сказал, используя "." в ключе ресурса не может быть хорошей идеей. "." имеет смысл в разных сценариях XAML, поэтому использование его в именах ключей также может смутить разработчика, читающего код, хотя Silverlight вполне доволен им.