Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
3 / 3 / 1
Регистрация: 13.12.2018
Сообщений: 214

Асинхронная подгрузка изображений

01.05.2020, 17:40. Показов 6982. Ответов 65
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Пытаюсь реализовать асинхронную подгрузку изображений в ListBox с помощью конвертера примерно так:

Класс конвертера:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
using FierceStukCloud_Lib.Models;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using System.Globalization;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media.Imaging;
using System.Windows.Threading;
 
namespace FierceStukCloud_PC.Converters
{
    public class SongToImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {       
            return new AsyncTask(() =>
            {
                return GetImage((string)value);
            });
        }
 
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
 
        public class AsyncTask : INotifyPropertyChanged
        {
            public AsyncTask(Func<BitmapImage> valueFunc)
            {
 
                AsyncValue = new BitmapImage(new Uri("pack://application:,,,/FierceStukCloud_PC;component/Resources/musiciconlight.png"));
                LoadValue(valueFunc);
            }
 
            private async Task LoadValue(Func<BitmapImage> valueFunc)
            {
                AsyncValue = await Task<BitmapImage>.Run(() =>
                {
                    return valueFunc();
                });
               
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("AsyncValue"));
 
            }
 
            public event PropertyChangedEventHandler PropertyChanged;
 
          
            public BitmapImage AsyncValue { get; set; }
             
        }
 
        public BitmapImage GetImage(string url)
        {
            TagLib.File file_TAG = TagLib.File.Create(url);
            try
            {
                if (file_TAG.Tag.Pictures.Length >= 1)
                {
                    var bin = (byte[])(file_TAG.Tag.Pictures[0].Data.Data); 
                    var kek = file_TAG.Tag.Pictures[0].Type;
                    var image = System.Drawing.Image.FromStream(new MemoryStream(bin)); 
                    var bitmapImage = new BitmapImage();
                    using (var ms = new MemoryStream()) 
                    {
                        image.Save(ms, ImageFormat.Jpeg);
                        ms.Seek(0, SeekOrigin.Begin);
                        bitmapImage.BeginInit();
                        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                        bitmapImage.StreamSource = ms;
                        bitmapImage.EndInit();
                    }
                    return bitmapImage;
                }
                else
                {
                    return GetDefaultPicture();
                }
            }
            catch (Exception)
            {
                try
                {
                    if (file_TAG.Tag.Pictures.Length >= 1)
                    {
                        var bin = (byte[])(file_TAG.Tag.Pictures[0].Data.Data);
                        var image = System.Drawing.Image.FromStream(new MemoryStream(bin)); 
                        var bitmapImage = new BitmapImage();
                        using (var ms = new MemoryStream()) 
                        {
                            image.Save(ms, ImageFormat.Png);
                            ms.Seek(0, SeekOrigin.Begin);
                            bitmapImage.BeginInit();
                            bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                            bitmapImage.StreamSource = ms;
                            bitmapImage.EndInit();
                        }
 
                        return bitmapImage;
                    }
                    else
                    {
                        return GetDefaultPicture();
                    }
                }
                catch (Exception)
                {
                    return GetDefaultPicture();
                }
            }
        }
 
        private BitmapImage GetDefaultPicture() => new BitmapImage(new 
                                                         Uri("pack://application:,,,/FierceStukCloud_PC;component/Resources/musiciconlight.png"));
    }
}
Обращение к конвертеру:

XML
1
2
3
4
 <Image Grid.Row="0"    
 
             DataContext="{Binding Path=LocalURL, Converter={StaticResource Key1}}"
             Source="{Binding AsyncValue}"/>
Класс взял отсюда: https://coderoad.ru/24731335/А... ачений-WPF

Метод GetImage возвращает BitmapImage, который вытягивается из mp3 файла. Сам метод рабочий, проверял его в коде Model.

Но происходит то, что я плохо понимаю. В классе AsyncTask в методе LoadValue после этого кода:
C#
1
2
3
4
                AsyncValue = await Task<BitmapImage>.Run(() =>
                {
                    return valueFunc();
                });
Я получаю вот такое значение в AsyncValue:

Однако сам метод valueFunc(GetImage) на моменте return bitmapImage имеет:


По итогу не получаю изображение из трека, если оно есть. Помогите кто знает как подобное решить.
Возможно есть другие варианты асинхронной подгрузки.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.05.2020, 17:40
Ответы с готовыми решениями:

Асинхронная загрузка изображений
Здравствуйте Делаю программу-просмотрщик яндекс карт. Есть до фига картинок, сохраненных на жестком диске. Есть окошко, в котором...

Асинхронная подгрузка данных при скролле страницы
всем привет. может кто то делал такую вещь? Асинхронная подгрузка данных при скроллинге страницы. Т.е. когда доходим до конца страницы...

Асинхронная подгрузка скриптов в wordpress
В гугле требуется добавить асинхронную подгрузку всех скриптов в шапке. Нужно к коду: &lt;script type='text/javascript'...

65
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
08.05.2020, 19:30
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ForeverFast Посмотреть сообщение
я так понимаю перед этим его нужно будет зашифровать?
Здесь сложная делема.
Если нужен только пароль на вход в приложение, то делается просто хеш от пары Login+Пароль.
При вводе проверяется на сравнение с хешем.

А вот если нужно хранение паролей от других сервисов (допустим, для доступа в БД), то здесь будет головняк.
Просто шифровать можно, но где хранить ключ для дешифровки?

Тогда надо из пары Login+Password получать пароли для шифрования/дешифрования хранилища.

Вообщем как-то так.
Я не спец по этой теме, знаю только по верхам в рамках ВУЗовского курса.
Для начала определитесь с самой задачей и требованиям по безовасности.
Потом ищите уже удовлетворяющие им механизмы и реализовывайте их.
0
3 / 3 / 1
Регистрация: 13.12.2018
Сообщений: 214
09.05.2020, 10:00  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Здесь сложная делема.
Если нужен только пароль на вход в приложение, то делается просто хеш от пары Login+Пароль.
При вводе проверяется на сравнение с хешем
Возник небольшой вопрос: Я убрал свои свойства Visibility и заменил их на конвертер. Но теперь столкнулся с проблемой касательно SecureString. Я не могу никак проверить введено ли что либо в password.
Перед тем как дать ответ, виден ли дефолтный текст "пароль" или нет, я проверяю на логический фокус и длину текста. Однако каждый раз получаю, что длина текста в SecureString равна 0.

Код конвертера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class StrLenghtToVisibilityConverter : IMultiValueConverter
    {
 
        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            bool IsFocused = false, IsLenghtNotZero = true;
 
 
            if (values[1] != null)
            {
                if ((string)parameter == "Password")
                {
                    if (values[1] is SecureString temp)
                    {
                        if (temp.Length == 0)
                            IsLenghtNotZero = false;
                        else IsLenghtNotZero = true;
                    }
                }
                else
                {
                    if (values[1] is string temp)
                    {
                        if (temp == "")
                            IsLenghtNotZero = false;
                        else IsLenghtNotZero = true;
                    }
                }
            }
            else return Visibility.Visible;
 
            if (values[0] != null)
            {
                if (values[0] is bool value)
                {
                    if (value == false)
                        IsFocused = false;
                    else IsFocused = true;
                }
            }
            else return Visibility.Visible;
 
            if (IsFocused == true || IsLenghtNotZero == true)
                return Visibility.Hidden;
            else return Visibility.Visible;
        }
 
        public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
xaml:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Grid>
                    <TextBlock Text="Пароль"
                               
                               Style="{StaticResource TBlock_LandP}">
                        <TextBlock.Visibility>
                            <MultiBinding Converter="{StaticResource StrLenghtToVisibility}" ConverterParameter="Password">
                                <Binding Path="IsFocused" ElementName="PassBox"/>
                                <Binding Path="SecurePassword" ElementName="PassBox"/>
                            </MultiBinding>
                        </TextBlock.Visibility>
                    </TextBlock>
 
                    <PasswordBox x:Name="PassBox"
                                 
                                 PasswordChanged="PasswordBox_PasswordChanged"
                                 Style="{StaticResource TBox_Password}"/>
                </Grid>
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
09.05.2020, 10:59
Цитата Сообщение от ForeverFast Посмотреть сообщение
Возник небольшой вопрос: Я убрал свои свойства Visibility и заменил их на конвертер. Но теперь столкнулся с проблемой касательно SecureString. Я не могу никак проверить введено ли что либо в password.
Перед тем как дать ответ, виден ли дефолтный текст "пароль" или нет, я проверяю на логический фокус и длину текста. Однако каждый раз получаю, что длина текста в SecureString равна 0.
"Водяной знак" на месте пустого поля - это чисто View функция.
И она не имеет никакого отношения к вводу данных, поэтому VM здесь не должна быть задействована.

Вариантов вывода "Водяных знаков" множество.
Поиск по только разделу даст вам, наверное, с десяток тем.

Лично мне больше всего нравится вот такой подход: Как постоянно проверять свойство контрола
1
3 / 3 / 1
Регистрация: 13.12.2018
Сообщений: 214
09.05.2020, 11:24  [ТС]
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 <Grid>
                    <TextBlock x:Name="passwordPlace"
                               Text="Пароль"
 
                               Style="{StaticResource TBlock_LandP}">
                    </TextBlock>
 
                    <PasswordBox x:Name="passwordBox"
                                 GotFocus="passwordBox_GotFocus"
                                 LostFocus="passwordBox_PasswordChanged"
                                 PasswordChanged="passwordBox_PasswordChanged"
                                 Style="{StaticResource TBox_Password}"/>
                    <x:Code>
                        <![CDATA[
                            private void passwordBox_PasswordChanged(object sender, RoutedEventArgs e)
                            { 
                                passwordPlace.Visibility = Visibility.Visible;
                                passwordPlace.Visibility = string.IsNullOrEmpty(passwordBox.Password)
                                ? Visibility.Visible
                                : Visibility.Hidden;
                            }
                        
                            private void passwordBox_GotFocus(object sender, RoutedEventArgs e)
                            {
                                passwordPlace.Visibility = Visibility.Hidden;
                            }
                        ]]>
                    </x:Code>
                </Grid>
Я добавил Get/Lost Focus к тому примеру. Вроде неплохо.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
09.05.2020, 21:48
ForeverFast, у меня не получается запустить ваш метод.
Вы же говорили, что он у вас в синхронном коде работает.
Скорректируйте код в новой ветки, что бы это метод хоть каким-то образом выдавал картинку.
Просто вставьте его вызов в конструктор VM и пусть выдаст хоть какую-то картинку.
0
3 / 3 / 1
Регистрация: 13.12.2018
Сообщений: 214
09.05.2020, 22:07  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Скорректируйте код
сделал
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
10.05.2020, 00:24
ForeverFast, сделал фиксацию:
Добавлен Диспетчер в загрузку изображений.
Асинхронная загрузка работает.
Но надо убрать мног других костылей.
Проверьте.
0
3 / 3 / 1
Регистрация: 13.12.2018
Сообщений: 214
10.05.2020, 00:42  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Добавлен Диспетчер в загрузку изображений.
Асинхронная загрузка работает.
Но надо убрать мног других костылей.
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Проверьте.
Проверил, всё работает. Завтра добавлю в основную ветку и протестирую на большем кол-ве треков. Если под костылями вы имейте ввиду мои свойства в VM, то я их уже переправил на адекватные и логику перенёс в xaml.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
10.05.2020, 08:54
Цитата Сообщение от ForeverFast Посмотреть сообщение
я их уже переправил на адекватные и логику перенёс в xaml.
Саму структуру Репозитория и Решения исправили?

Добавлено через 1 минуту
Цитата Сообщение от ForeverFast Посмотреть сообщение
Если под костылями вы имейте ввиду мои свойства в VM
Под костылями, я имел виду сам способ асинхронной загрузки.
Он выполняется асинхронно, но а основном потоке.
Попробую дальше разобраться.

Добавлено через 11 минут
ForeverFast, и не понял для чего у вас в try..catch двойное повторение одного и того же кода.
0
3 / 3 / 1
Регистрация: 13.12.2018
Сообщений: 214
10.05.2020, 11:03  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
ForeverFast, и не понял для чего у вас в try..catch двойное повторение одного и того же кода
Если выкидывает исключение для попытки вывести jpeg пикчу, то в catch он пытается png достать. Но как я увидел, можно было без этой части кода с using (var ms = new MemoryStream()), а оставить только
C#
1
2
3
4
5
6
7
8
9
10
11
 var bin = file_TAG.Tag.Pictures[0].Data.Data; // Конвертация в массив байтов
 
                    var bitmapImage = new BitmapImage();
 
                    bitmapImage.BeginInit();
                    bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                    bitmapImage.StreamSource = new MemoryStream(bin);
                    bitmapImage.EndInit();
 
 
                    return bitmapImage;
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
10.05.2020, 16:17
ForeverFast, сделал фиксацию:
Добавлена коллекция для ImageAsyncBase.
Добавлена поддержка загрузки из упакованных ресурсов.
В методе загрузки для демонстрации стоит Sleep, его надо убрать при использовании.
Добавлено изображение по умолчанию для треков без обложки.
Добавлены перегрузки конструктора VM для Времени Разработки Дизайна.
В таком виде уже более менее.
Использовать удобно.

Обязательно посмотрите как реализована загрузка из упакованных ресурсов.
Таким образом можно "прятать" файлы внутрь сборки.

Добавлено через 3 часа 40 минут
ForeverFast, финальная фиксация:
Добавил возможность ImageAsync соединяться к Контентом.
В VM в Контент Image добавлен тип Song/
На этом, для данной задачи, реализация ImageAsync завершена.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
06.08.2020, 19:50
Лучший ответ Сообщение было отмечено ForeverFast как решение

Решение

ForeverFast, "Учиться, учиться и ещё раз учиться"!

Это и про меня.
Недавно разбирался с работой с DependencyObject из других потоков.
И вспомнил за эту так до конца и неоконченную тему.

Решение проблемы кроется в ЗАМОРОЗКЕ (Freeze) изображения после его получения.
После этого с изображением можно работать из любого потока.

В тип ImageAsyncBase добавлен метод ImageFreezeLoad замораживающий полученное изображение (строка 69):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using System.Threading.Tasks;
using System.Windows.Media;
 
namespace FierceStukCloud_NetCoreLib.Services.ImageAsyncS
{
    /// <summary>Базовый класс с ImageSource загружаемым
    /// ассинхронно после первого требования</summary>
    public abstract class ImageAsyncBase : OnPropertyChangedClass
    {
        #region Поля для хранения значений свойств
        private ImageSource _imageDefault;
        private bool _isImageLoaded;
        private object _imageUri;
        #endregion
 
 
 
        /// <summary>Изображение по умолчанию.
        /// Выводится пока не загружено основное изображение</summary>
        public ImageSource ImageDefault { get => _imageDefault; set => SetProperty(ref _imageDefault, value); }
 
        /// <summary>Флаг загруженности основного изображения</summary>
        public bool IsImageLoaded { get => _isImageLoaded; private set => SetProperty(ref _isImageLoaded, value); }
 
        /// <summary>Uri основного изображения.
        /// Может быть не обязательно типа Uri.
        /// Но записанный тип должен правильно обрабытываться
        /// в методе ImageLoad определяемом в производном классе.</summary>
        public object ImageUri { get => _imageUri; set => SetProperty(ref _imageUri, value); }
 
        /// <summary>Основное изображение</summary>
        public ImageSource Image
        {
            get
            {
                if (IsImageLoaded)
                    return UploadedImage;
 
                if (ImageUri != DownloadUri)
                    ImageLoadAsync();
                return ImageDefault;
            }
        }
 
        /// <summary>Загруженное изображение</summary>
        protected ImageSource UploadedImage { get; private set; }
 
        /// <summary>Загружаемый Uri</summary>
        protected object DownloadUri { get; private set; }
 
        /// <summary>Асинхронная загрузка изображения</summary>
        private async void ImageLoadAsync()
        {
            if (ImageUri == default)
                return;
            object ImageUriLoad = DownloadUri = ImageUri;
            ImageSource image = await Task.Factory.StartNew(ImageFreezeLoad, ImageUriLoad);
 
            if (ImageUriLoad.Equals(ImageUri))
            {
                UploadedImage = image;
                IsImageLoaded = true;
            }
        }
 
        /// <summary>Синхронная загрузка изображения заданого Uri и его заморозка.</summary>
        /// <param name="uri">Uri изображения</param>
        /// <returns>Замороженный ImageSource с загруженным изображением</returns>
        protected ImageSource ImageFreezeLoad(object uri)
        {
            ImageSource image = ImageLoad(uri);
            image.Freeze();
            return image;
        }
 
 
        /// <summary>Синхронная загрузка изображения заданого Uri</summary>
        /// <param name="uri">Uri изображения</param>
        /// <returns>ImageSource с загруженным изображением</returns>
        public abstract ImageSource ImageLoad(object uri);
 
        protected override void PropertyNewValue<T>(ref T fieldProperty, T newValue, string propertyName)
        {
            base.PropertyNewValue(ref fieldProperty, newValue, propertyName);
 
            if (propertyName == nameof(ImageDefault))
            {
                if (!IsImageLoaded)
                    OnPropertyChanged(nameof(Image));
            }
            else if (propertyName == nameof(IsImageLoaded))
            {
                OnPropertyChanged(nameof(Image));
            }
            else if (propertyName == nameof(ImageUri))
            {
                IsImageLoaded = false;
            }
        }
    }
}
Из остальных типов убрана передача Диспетчера, так как она не нужна.

После внесения изменений приложение проверил - всё работает.

Проект на GitHub https://github.com/ForeverFast/FierceStukCloud

Фиксация 78742bb9 от 06.08.2020 19:49:05:
Исправлена реализация асинхронной загрузки изображений: убрано создание ImageSource в Dispatcher и добавлена заморозка изображения.
2
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
08.11.2020, 05:38
Доброго времени суток, Элд Хасп.

И так. В моделе создал
C#
1
2
3
4
5
    public class ImageVO
    {
        public string Title { get; set; }
        public ImageAsync ImageContent { get; set; }
    }
Также у меня есть Dto класс фальма:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MovieDto
    {
        //...
 
        /// <summary>Фото обложки фильма.</summary>
        public string PhotoLink { get; }
 
        //...
 
        public MovieDto(int id, string imdbID,  string name, TimeSpan runtime, int year, string genre, string writer, bool favoriteStatus)
        {
            Id = id; ImdbID = imdbID; Name = name; Runtime = runtime; Year = year; Genre = genre; Writer = writer; FavoriteStatus = favoriteStatus;
        }
        public MovieDto(int id, string imdbID, string name, TimeSpan runtime, int year, string genre, string writer, bool favoriteStatus, string photoLink)
        {
            Id = id; ImdbID = imdbID; Name = name; Runtime = runtime; Year = year; Genre = genre; Writer = writer; FavoriteStatus = favoriteStatus; PhotoLink = photoLink;
        }
Также в VM закинул класс ImageAsync : ImageAsyncBase.

MovieViewModel.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    //...
    private ImageVO _image;
    public ImageVO Image { get => _image; set => SetProperty(ref _image, value); }
    public ImageSource ImageDefault { get; set; } = new BitmapImage(new Uri("/Picture/Empty.png", UriKind.Relative));
 
    public void CopyFrom(MovieDto obj)
    {
        Id = obj.Id; Name = obj.Name; Runtime = obj.Runtime; Year = obj.Year; Genre = obj.Genre; Writer = obj.Writer; FavoriteStatus = obj.FavoriteStatus; 
            
        if(obj.PhotoLink!=null)
            Image = new ImageVO() { Title = obj.Name, ImageContent = new ImageAsync() { ImageDefault = ImageDefault, ImageUri = new Uri(obj.PhotoLink) } };
        else
            Image = new ImageVO() { Title = obj.Name, ImageContent = new ImageAsync() { ImageDefault = ImageDefault } };
    }
Я уверен что уже на данном этапе куча ошибок, но я продолжил и тут у меня встал вопрос касательно строки DataType="{x:Type local:ImageData}", ибо в моём случае она не подходит, как я понимаю.
XML
1
2
3
4
5
6
7
        <ListBox ItemsSource="{Binding Movies}">
            <ListBox.ItemTemplate>
                <DataTemplate DataType="{x:Type local:ImageVO}">
                    <uc:ItemUC Image="{Binding Image.ImageContent, Mode=OneWay}"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
Также я не понял что мне в UC передавать "Image.ImageContent" или же просто "Image".

ItemUC.xaml
XML
1
2
3
4
5
6
<UserControl x:Class="ShipCheaperView.UC.ItemUC"
                    Name="uc"/>
    <Grid Width="Auto">
        <Image Source="{Binding ElementName=uc, Path=Image}"/>
    </Grid>
</UserControl>
Абсолютно никаких изменений нет.

П.С. ItemUC не должен быть UC, но пока так, потом исправлю.

Добавлено через 8 минут
________________________________________ __
Файл ImageVO.cs был перекинуть в VM
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
08.11.2020, 09:39
limeniye, выложите архив Решения включая рисунками.
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
08.11.2020, 13:41
Элд Хасп, ну, изображение там только 1 -- дэфолтное(локально). Остальные должны подрузиться через глобальную сеть.
Но у меня даже дефолтное изображение не отображает.
ShipCheaperApplication.rar
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
08.11.2020, 15:03
limeniye, когда создаёте архив Решение, то не включайте в него папки: obj, bin, .*, packages
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
09.11.2020, 22:43
Здравствуйте, Элд Хасп. Слегка изменил реализацию добавления, посмотрите, пожалуйста .

ImageAsyncBase
C#
1
2
3
4
5
6
7
8
9
        /// <summary>Синхронная загрузка изображения заданого Uri и его заморозка.</summary>
        /// <param name="uri">Uri изображения</param>
        /// <returns>Замороженный BitmapImage с загруженным изображением</returns>
        protected BitmapImage ImageFreezeLoad(object uri)
        {
            BitmapImage image = ImageLoad(uri);
            image?.Freeze();
            return image;
        }
ImageAsync
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        public override BitmapImage ImageLoad(object uri)
        {
            WebClient wc = new WebClient();
 
            //byte[] imageByte = await wc.DownloadDataTaskAsync(new Uri(uri));
            byte[] imageByte = wc.DownloadData(new Uri(uri.ToString()));
 
            BitmapImage image = new BitmapImage();
            image = BytesToImage(imageByte);
 
            return image;
 
            throw new InvalidCastException($"В параметре {nameof(uri)} получен тип недопустиый для конвертации в BitmapImage");
        }
 
        public static BitmapImage BytesToImage(byte[] bytes)
        {
            BitmapImage bitmapImage = new BitmapImage();
            try
            {
                using (MemoryStream ms = new MemoryStream(bytes))
                {
                    bitmapImage.BeginInit();
                    bitmapImage.StreamSource = ms;
                    bitmapImage.EndInit();
                    return bitmapImage;
                }
            }
            finally { bitmapImage = null; }
        }
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16115 / 11236 / 2887
Регистрация: 21.04.2018
Сообщений: 33,038
Записей в блоге: 2
09.11.2020, 23:03
Методы ImageLoad и BytesToImage надо объединить в один:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        public override BitmapImage ImageLoad(object uri)
        {
            WebClient wc = new WebClient();
 
            try
            {
                if (!(uri is Uri uriWeb))
                      uriWeb = new Uri(uri.ToString());
 
                byte[] imageBytes = wc.DownloadData(uriWeb);
 
                using (MemoryStream ms = new MemoryStream(imageBytes))
                {
                    BitmapImage bitmapImage = new BitmapImage();
                    bitmapImage.BeginInit();
                    bitmapImage.StreamSource = ms;
                    bitmapImage.EndInit();
                    return bitmapImage;
                }
            }
            return null;
        }
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
10.11.2020, 00:19
Элд Хасп, работает!
Есть небольшой баг.

Пять элементов: из них последние 2 имеют изображение, а вот на первые два -- нет.
При старте есть изображения, и через пол секунды пропадает с первых трёх.

Добавлено через 1 минуту
Элд Хасп,

C#
1
2
3
4
5
6
7
8
movieDict = new MovieDto[]
            {
                new MovieDto(0, "yaf", "Роки", new TimeSpan(1,30,54), 1984, "Ужасы", "Это лол кекный чебукчай", true, "https://upload.wikimedia.org/wikipedia/ru/thumb/1/18/Rocky_poster.jpg/315px-Rocky_poster.jpg"),
                new MovieDto(1, "33", "Кек", new TimeSpan(1,30,54), 1984, "Ужасы", "Это лол кекный чебукчай", false, "https://www.kino-teatr.ru/movie/poster/117171.jpg"),
                new MovieDto(2, "fasf",  "Лол", new TimeSpan(1,30,54), 1984, "Ужасы", "Это лол кекный чебукчай", true, "https://www.kinopoisk.ru/film/495017/posters/"),
                new MovieDto(3, "gygaf",  "Азазек", new TimeSpan(1,30,54), 1984, "Ужасы", "Это лол кекный чебукчай", true),
                new MovieDto(4, "gasgas",  "Чебукрчай", new TimeSpan(1,30,54), 1984, "Ужасы", "Это лол кекный чебукчай", true)
            }
0
 Аватар для limeniye
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
10.11.2020, 01:05
Элд Хасп,



ShipCheaperApplication(limeniye).rar

По идее для первой сслыки "https://upload.wikimedia.org/wikipedia/ru/thumb/1/18/Rocky_poster.jpg/315px-Rocky_poster.jpg"должен произойти следующий код:
C#
1
2
3
4
5
6
7
8
using (MemoryStream ms = new MemoryStream(imageBytes))
{
    BitmapImage bitmapImage = new BitmapImage();
    bitmapImage.BeginInit();
    bitmapImage.StreamSource = ms;
    bitmapImage.EndInit();
    return bitmapImage;
}
Но до него не доходит и просто скипается дальше на следующую ссылку
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.11.2020, 01:05
Помогаю со студенческими работами здесь

OpenGL ES 2.0: Асинхронная подгрузка сцены
Здравствуйте! Никак не могу разобраться, как на Android в OpenGL ES 2.0 динамически сменить отрисовываемые сцены. То есть, у меня в...

Асинхронная загрузка изображений по клику на ссылки
Есть страница со списком фото. Под каждой фото кнопка-ссылка &quot;Сменить фото&quot;. Никак не могу разобраться как прикрутить вызов аплоадера по...

Подгрузка изображений
Помогите пожалуйста с такой задачей: &lt;img src=&quot;/image.jpg&quot; onmouseover=&quot;this.src='/image.gif'&quot;...

Список - подгрузка изображений
День добрый, уважаемые, форумчане! С наступающем всех! Подскажите, кому не сложно: Как сделать так, что бы при выборе, в...

TsAlphaImageList, динамическая подгрузка изображений
Нужно в TreeView получить имена папок(в определённой директории) и в зависимости от имени папки, загрузить для неё изображение в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru