WPF Источник изображения от константы - PullRequest
3 голосов
/ 26 февраля 2011

У меня есть несколько значков, которые являются ресурсами в моем проекте, и я планирую использовать эти значки для пунктов меню и других вещей.

Я создал класс констант, чтобы хранить расположение этих значков в центре, а не жестко кодировать их в каждом пункте меню и т. Д.

* 1005 Е.Г. *

public const string IconName = "/Project;component/Icons/IconName.png";

Если я жестко закодирую это значение в свойстве Source изображения в xaml, оно будет работать нормально. Однако, если я попытаюсь сослаться на эту константу, она потерпит неудачу.

1010 * Е.Г. *

<Image Source="{x:Static pb:IconConstants.IconName}" Width="16" Height="16" />

Сбой этого исключения: «Невозможно преобразовать значение в атрибуте« Источник »в объект типа« System.Windows.Media.ImageSource ».».

Какая разница между этим и мной просто в жестком кодировании значения? Есть ли лучший способ ссылки на мои константы в xaml?

Спасибо, Alan

Ответы [ 2 ]

6 голосов
/ 26 февраля 2011

Разница в том, что в первом случае (когда вы жестко закодируете путь) синтаксический анализатор XAML вызовет преобразователь значения (ImageSourceConverter) для строки, указанной вами в атрибуте Source, чтобы преобразовать ее в значение типа ImageSource.В то время как во втором случае ожидается, что значение вашей константы уже будет иметь тип ImageSource.

Что вы можете сделать, так это то, что вы можете поместить все пути в глобальный ResourceDictionary:

<Window.Resources>
    <ResourceDictionary>
        <BitmapImage x:Key="IconName">/Project;component/Icons/IconName.png</BitmapImage>
    </ResourceDictionary>
</Window.Resources>

<Image Source="{StaticResource IconName}" Width="16" Height="16" />

Если вы хотите сохранить константы пути в коде, вы можете иметь Uri объекты как константы и установить свойство UriSource BitmapImage для этого URI:

public static readonly Uri IconName = new Uri("/Project;component/Icons/IconName.png", UriKind.Relative); 

<BitmapImage x:Key="IconName" UriSource="{x:Static pb:IconConstants.IconName}"/>
4 голосов
/ 13 декабря 2012

Если вы хотите указать изображение в качестве ресурса в словаре ресурсов, есть небольшая модификация поверх того, что упомянул Павло.Если указать путь к изображению непосредственно в словаре ресурсов, для Windows 8 XAML выдает ошибку

"Ошибка 1 Отсутствует определение свойства содержимого для элемента" BitmapImage "для получения содержимого" / Project; компонент / значки/IconName.png'

Чтобы решить эту проблему, вам нужно будет указать путь как UriSource.

<ResourceDictionary>
  <BitmapImage x:Key="ImageFollowOnFacebook" 
               UriSource="Assets/FollowOnFacebookImage.png"/>
</ResourceDictionary>
...