Доступ к ResourceDictionary из WPF UserControl - PullRequest
7 голосов
/ 02 июня 2009

Я пытаюсь получить доступ к словарю ресурсов в программном коде UserControl через C #, и у меня небольшой успех.

Объединенный словарь:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/BiometricDictionary.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Встроенный словарь:

<UserControl.Resources>
    <BitmapImage x:Key="imageDefault">/Resources/Images/default_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageDisconnected">/Resources/Images/disconnect_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageFailed">/Resources/Images/failed_thumb.png</BitmapImage>
    <BitmapImage x:Key="imageSuccess">/Resources/Images/success_thumb.png</BitmapImage>
</UserControl.Resources>

Код позади:

        var resourceDictionary = new ResourceDictionary();
        resourceDictionary.Source = new Uri("/Resources/BiometricDictionary.xaml", UriKind.Relative);

Я перепробовал все примеры и полезные советы, но вкратце. Прямо сейчас, успех будет возможность загрузить словарь. Какие-либо предложения?

Ответы [ 4 ]

7 голосов
/ 02 июня 2009

Чтобы получить доступ к одному из ресурсов XAML вашего UserControl в вашем коде, все, что вам нужно сделать, - это получить доступ к свойству Resources в UserControl. Примерно так:

BitmapImage myImage = (BitmapImage)this.Resources["imageDefault"];

Хотя предпочтительным методом является использование FindResource (), которое будет искать все логическое дерево на предмет соответствия ключу, а не просто объект, для которого он вызывается.

BitmapImage myImage = (BitmapImage)this.FindResource("imageDefault");
1 голос
/ 15 апреля 2015

Попробуйте удалить косую черту перед вашим местоположением. Единственный раз, когда вы должны использовать / Ресурсы, это если вам сначала нужно пойти в библиотеку. как ../Resources

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
           <ResourceDictionary Source="Resources/BiometricDictionary.xaml" />                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Надеюсь, это поможет вам.

0 голосов
/ 02 июня 2009

d'Oh ... после компиляции в локальную корзину, чтобы ссылки были относительными, я реализовал решение URI пакета, найденное здесь: ResourceDictionary в отдельной сборке , а затем FindResource (значение x: здесь здесь ).

@ PeterAllenWeb, @Pwninstein, спасибо за ваши быстрые ответы и заставили меня задуматься.

0 голосов
/ 02 июня 2009

Итак, у вас есть ResourceDictionary, определенный в сборке UserControl, и вы хотите получить к нему доступ из кода этого UserControl?

Вы должны быть в состоянии. Однако, если указанный вами код находится в конструкторе, у вас может не быть доступа к словарю ресурсов (возможно, еще не загружен). Попробуйте добавить этот же код в «загруженное» событие вашего UserControl и посмотрите, работает ли он. Если вы просто пытаетесь получить доступ к ресурсу, такому как стиль или шаблон, с помощью функций " FindResource " или " TryFindResource ", работающих непосредственно из вашего класса (то есть вам не нужно иметь объект типа "ResourceDictionary").

Надеюсь, это поможет!

...