Мои.Ресурсы в WPF XAML? - PullRequest
       79

Мои.Ресурсы в WPF XAML?

7 голосов
/ 14 сентября 2009

Есть ли способ получить доступ к My.Resources через Xaml?

Как это

<Image Source="{Binding MyImage,
    Source={x:Static my:Resources},
    Converter={StaticResource MyBitmapToImageSourceConverter}}" />

Это ошибка, которую я получаю: \ Application.xaml (122,36): ошибка MC3029: член 'my: Resources' недопустим, поскольку у него нет подходящего имени типа.

Выше не работает, конечно.

ПРИМЕЧАНИЕ. Преобразователь предназначен только для иллюстрации.


Обновление:

Я подумал об одной идее, которая может быть хорошим подходом, если она будет работать, я создал класс-оболочку для ресурсов:

Public Class Resources
    Public Shared ReadOnly m_Resources As New Resources
    Public Shared ReadOnly Property Resources() As Resources
        Get
            Return m_Resources
        End Get
    End Property

    Public ReadOnly Property MyResources(ByVal name As String) As Object
        Get
            Return My.Resources.ResourceManager.GetObject(name)
        End Get
    End Property
End Class

А потом в своем переплете я пытаюсь получить к нему доступ так:

<Setter Property="ImageSource"
Value="{Binding MyResources[Ok], Source={x:Static src:Resources.Resources}}"/>

Но я все еще получаю следующее сообщение:

System.Windows.Data Ошибка: 16: Не удается получить значение «MyResources» (тип «Объект») из «» (тип «Ресурсы»). BindingExpression: Path = MyResources [Ok]; DataItem = 'Resources' (HashCode = 59109011); целевым элементом является 'Image' (Name = 'btnOk'); Свойство target - «Source» (тип «ImageSource»). TargetParameterCountException: «System.Reflection.TargetParameterCountException: несоответствие количества параметров.

Кстати, я поместил тестовый MessageBox в средство получения MyResources, и, похоже, к этому свойству вообще нет доступа.

Ответы [ 2 ]

9 голосов
/ 14 сентября 2009

Проблема в том, что по умолчанию инструмент, генерирующий код для файла Resources.resx, имеет значение VbMyResourcesResXFileCodeGenerator (свойство «Пользовательский инструмент» элемента проекта). Этот инструмент генерирует модуль, в котором свойства ресурса являются внутренними (Friend), поэтому StaticExtension не может получить к нему доступ. Чтобы решить эту проблему, вы должны изменить пользовательский инструмент для Resources.resx на PublicVbMyResourcesResXFileCodeGenerator, который будет генерировать открытые члены.

Кроме того, модуль VB примерно эквивалентен статическому (Shared) классу, поэтому нет экземпляра Resources, который мог бы использоваться в качестве источника привязки, поэтому вы не можете указать Path для привязки. Вы должны установить источник привязки непосредственно к желаемому свойству:

<Image Source="{Binding Source={x:Static my:Resources.MyImage},
    Converter={StaticResource MyBitmapToImageSourceConverter}}" />

Примечание. Для создания кода для файла ресурсов доступна еще одна пара инструментов: ResXFileCodeGenerator и PublicResXFileCodeGenerator. Эти инструменты генерируют класс вместо модуля.

РЕДАКТИРОВАТЬ: сопоставление пространства имен для использования является следующим:

xmlns:myRes="clr-namespace:YourApplicationName.My.Resources"
3 голосов
/ 16 сентября 2011

Измените модификатор доступа my.resources с freind на public на вкладке ресурсов my.project.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...