Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Изображение UriSource и привязка данных
Я пытаюсь привязать список пользовательских объектов к изображению WPF, как это:
<Image>
<Image.Source>
<BitmapImage UriSource="{Binding Path=ImagePath}" />
</Image.Source>
</Image>
Но это не работает. Это ошибка, которую я получаю:
"Свойство 'UriSource' или свойство 'StreamSource' должно быть установлено."
Что я упускаю из виду?
WPF имеет встроенные преобразователи для определенных типов. Если вы привязываете свойство Source изображения к значению string или Uri , под капотом WPF будет использовать ImageSourceConverter для преобразования значения в ImageSource .
Так
<Image Source="{Binding ImageSource}"/>
будет работать, если свойство ImageSource является строковым представлением допустимого URI для изображения.
Вы можете конечно свернуть свой собственный конвертер Привязок:
public class ImageConverter : IValueConverter
{
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
return new BitmapImage(new Uri(value.ToString()));
}
public object ConvertBack(
object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
и используй его вот так:
<Image Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}"/>
В этой статье Атула Гупты есть пример кода, который охватывает несколько сценариев:
- Обычная привязка изображения к источнику собственность в XAML
- Привязка образа ресурса, но из кода позади
- Привязка образа ресурса в коде сзади с помощью Application.GetResourceStream
- Загрузка изображения из пути к файлу через поток памяти (то же самое применимо при загрузке данных изображения блога из базы данных)
- Загрузка изображения из пути к файлу, но с помощью привязки к свойству пути к файлу
- Привязка данных изображения к пользовательскому элементу управления, который внутренне имеет управление изображением через свойство зависимостей
- То же самое, что и пункт 5, но также гарантирует, что файл не будет заблокирован на жестком диске
Вы также можете просто установить исходный атрибут, а не использовать дочерние элементы. Для этого ваш класс должен вернуть изображение как Bitmap образ. Вот пример того, как я это сделал
<Image Width="90" Height="90"
Source="{Binding Path=ImageSource}"
Margin="0,0,0,5" />
А свойство класса просто таково
public object ImageSource {
get {
BitmapImage image = new BitmapImage();
try {
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
image.UriSource = new Uri( FullPath, UriKind.Absolute );
image.EndInit();
}
catch{
return DependencyProperty.UnsetValue;
}
return image;
}
}
Я полагаю, что это может быть немного больше работы, чем конвертер значений, но это другой вариант.
Вам нужно иметь реализацию интерфейса IValueConverter , который преобразует uri в образ. Ваша реализация преобразования IValueConverter будет выглядеть примерно так:
BitmapImage image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(value as string);
image.EndInit();
return image;
Тогда вам нужно будет использовать конвертер в вашей привязке:
<Image>
<Image.Source>
<BitmapImage UriSource="{Binding Path=ImagePath, Converter=...}" />
</Image.Source>
</Image>
Проблема с ответом, который был выбран здесь, заключается в том, что при перемещении вперед и назад конвертер будет срабатывать каждый раз, когда отображается страница.
Это приводит к тому, что новые дескрипторы файлов будут создаваться непрерывно и будут блокировать любые попытки удалить файл, поскольку он все еще используется. Это можно проверить с помощью процесса Explorer.
Если файл изображения может быть удален в какой-то момент, можно использовать такой конвертер, как этот: использование XAML для привязки к System.Drawing.Image в элемент управления System.Windows.Image
Недостатком этого метода потока памяти является то, что изображения загружаются и декодируются каждый раз, и никакое кэширование не может иметь место: "Чтобы предотвратить повторное декодирование изображений, присвойте свойству Image.Source свойство Uri вместо использования потоков памяти" Источник: "Performance tips for Windows Store apps using XAML"
Чтобы решить проблему производительности, шаблон репозитория можно использовать для обеспечения слоя кэширования. Кэширование может происходить в памяти, что может вызвать проблемы с памятью, или в виде файлов миниатюр, которые находятся в папке temp и могут быть очищены при выходе из приложения.