Разница между поведением URI-кода в коде и в XAML - PullRequest
3 голосов
/ 29 сентября 2010

У меня есть изображение, объявленное в некотором XAML как:

<Image Width="188" Height="56" HorizontalAlignment="Left"  VerticalAlignment="Bottom" Margin="10,0,0,10" Grid.ColumnSpan="2" Grid.Column="0" Source="..\Images\myImage.png" />

Это статическое изображение, которое не нужно изменять во время выполнения программы.

У меня также есть изображение, которое делаетнеобходимо изменить во время выполнения, в зависимости от набора значений.

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

Я пытаюсь создать серию System.Windows.Media.Imaging.BitmapImage объектов для хранения изображений.Как и в приведенном выше коде, я пытаюсь получить доступ к .PNG, хранящемуся в каталоге \ Images:

Dim ThisImage As New BitmapImage(New Uri("..\Images\thisImage.png", UriKind.Relative))

В то время как использование `" .. \ Images \ "работает нормально для XAML, правильно открываетсяизображение, хранящееся в [Project Directory] \ Images \, в коде, кажется, оно указывает на [Project Directory] \ bin \ Images \, которого не существует.

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

Чего мне здесь не хватает?Почему XAML URI не работает так же, как URI кода?

Ответы [ 2 ]

3 голосов
/ 29 сентября 2010

Когда вы определяете свойство Image.Source в XAML с помощью URI, для преобразования этого URI в экземпляр ImageSource используется преобразователь (ImageSourceConverter).Преобразователь имеет доступ к IUriContext элемента XAML, поэтому он знает базовый URI, который будет использоваться для разрешения относительного URI.

При создании BitmapImage в коде класс BitmapImage неУ него нет доступа к контексту URI, поэтому он не знает, как разрешить относительный URI.Вам необходимо указать абсолютный URI в форме "pack://application:,,,/Images/thisImage.png"

1 голос
/ 29 сентября 2010

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

Это работает так, как вы ожидаете в XAML, потому что в ImageSourceConverter (который используется для преобразования Uri в xaml в ImageSource) относительные Uris преобразуются в абсолютные Uris с помощью IUriContext сервис, доступный через ITypeDescriptorContext .Другими словами, Ури не волшебство.Проделана большая тяжелая работа (в данном случае десериализатором xaml) для преобразования относительного Uri в xaml в ImageSource.

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