Модераторы: gambit, Kefir, Partizan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Задача о загрузке картинок 
V
    Опции темы
DenWPF
Дата 8.6.2011, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Есть задача.

При биндинге в datagrid нужно проверять, если картинка существует, отобразить её, если нет, то отобразить стандартную картинку.

Я уже как только не пробывал.

Картинки хранятся относительно главного .xap   /images/ 

Код

string pathImage = Application.Current.Host.Source.AbsoluteUri.Substring(0,
                    Application.Current.Host.Source.AbsoluteUri.LastIndexOf("/"));
pathImage += value.ToString();


pathImage - полный путь к картинке к примеру http://localhost:65051/ClientBin/images/sm_butter_cake.jpg


если использовать File.exist то всё время возвращает false.


пробую такой конвертер.

Код

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            try
            {
                string pathImage = Application.Current.Host.Source.AbsoluteUri.Substring(0,
                    Application.Current.Host.Source.AbsoluteUri.LastIndexOf("/"));
                var webRequest = (HttpWebRequest)System.Net.WebRequest.Create(pathImage+value.ToString());
                var webResponse = (HttpWebResponse)webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), webRequest);


                return new BitmapImage(new Uri("http://upload.wikimedia.org/wikipedia/commons/1/1c/No-Symbol.png"));

            }
            catch { return new BitmapImage(new Uri("http://upload.wikimedia.org/wikipedia/commons/1/1c/No-Symbol.png")); }
        }
void FinishWebRequest(IAsyncResult result)
        {
            string value = "http://localhost:65051/ClientBin/images/sm_butter_cake.jpg";
            HttpWebResponse webResponse = (result.AsyncState as HttpWebRequest).EndGetResponse(result) as HttpWebResponse;
            if (webResponse.StatusCode != HttpStatusCode.OK)
            {
                var image = new BitmapImage(new Uri(value.ToString(), UriKind.Relative));
               // вот эта картинка должна возвращаться, но как её вернуть обратно не понимаю.
            }
            else
            {
                throw new Exception("Not file");
            }
        }



хелп.

PM MAIL   Вверх
-Mikle-
Дата 8.6.2011, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Попробуй сделать иначе. Размести Image с дефолтовой картинкой, поверх него размести Image с динамической картинкой. В том случае когда динамической картинки не существует на сервере, Image будет прозрачным и сквозь него будет видно дефолтовую картинку. Чтобы не грузить зря два Image, можно еще (на всякий случай) в бленде поиграться с визибилити для этих Image основанных на результате загрузки динамической картинки, хотя... кажется это не имеет смысла.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
DenWPF
Дата 8.6.2011, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Всё гениальное просто, но есть большой минус, если к примеру у меня картинка png то надо убивать прозрачность.
И если картинок много и грузятся долго, то получиться что в начале картинка КАРТИНКИНЕТ, а потом появятся, наверное есть вариант сделать ЛЖЕ загрузку, сделать какой то эффект при Load.
PM MAIL   Вверх
-Mikle-
Дата 8.6.2011, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Это верно.

Цитата(-Mikle- @  8.6.2011,  11:58 Найти цитируемый пост)
Чтобы не грузить зря два Image, можно еще (на всякий случай) в бленде поиграться с визибилити для этих Image основанных на результате загрузки динамической картинки, хотя... кажется это не имеет смысла.

Тогда вышесказанное, нужно сделать необходимым. Сначала обе картинки колэпсид, затем, основываясь на результате загрузки, показывать одну из них. Правда сейчас, сходу, я не могу сказать как проверить результат загрузки, но надеюсь, что это возможно.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
DenWPF
Дата 8.6.2011, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Проверять пиксели, если есть цвета то загружен, только куда это пихнуть))
PM MAIL   Вверх
Brilona
Дата 8.6.2011, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 8.7.2008

Репутация: 2
Всего: 3



А нельзя ли использовать событие ImageFailed? Если оно произошло, то Image.Source присваивать путь к дефолтной картинке.
PM MAIL ICQ   Вверх
DenWPF
Дата 8.6.2011, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Пример можешь привести
PM MAIL   Вверх
Brilona
Дата 9.6.2011, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 8.7.2008

Репутация: 2
Всего: 3



Код

<Image Grid.Row="0" Source="http://upload.wikimedia.org/wikipedia/commons/1/1c/No-Symbol.png" ImageFailed="Image_ImageFailed"/>


Код

private void Image_ImageFailed(object sender, ExceptionRoutedEventArgs e)
{
        (sender as Image).Source = new BitmapImage(new Uri("default.png", UriKind.RelativeOrAbsolute));
}


Если указанный в Source файл не существует, то будет отображаться default.png
PM MAIL ICQ   Вверх
-Mikle-
Дата 9.6.2011, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



В бленде за пару минут сделал и даже не понадобилось второй картинки как я говорил выше. Сделал по событию ImageFailed.
Код

        <Border HorizontalAlignment="Left" Height="156" Margin="42,54,0,0" VerticalAlignment="Top" Width="158" BorderBrush="#FF009CFF" BorderThickness="1">
            <Image x:Name="image">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="ImageFailed">
                        <ei:ChangePropertyAction PropertyName="Source">
                            <ei:ChangePropertyAction.Value>
                                <ImageSource>imageFailed.png</ImageSource>
                            </ei:ChangePropertyAction.Value>
                        </ei:ChangePropertyAction>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Image>
        </Border>


Скармливаешь объекту image свою картинку, если ее нету или она не валидна, выставляется дефолтовая imageFailed.png

Добавлено через 1 минуту и 29 секунд
Опередили, но суть в моем примере такая же, только декларативно.

Добавлено через 3 минуты и 14 секунд
Вот еще две кнопки тестирующие, тоже декларативно.

Код

        <Button Content="правильная" Height="40" Margin="288,54,203,0" VerticalAlignment="Top">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <ei:ChangePropertyAction TargetObject="{Binding ElementName=image}" PropertyName="Source">
                        <ei:ChangePropertyAction.Value>
                            <ImageSource>http://i1.i.ua/prikol/pic/8/4/427148.jpg</ImageSource>
                        </ei:ChangePropertyAction.Value>
                    </ei:ChangePropertyAction>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>

        <Button Content="НЕ правильная" Height="40" Margin="288,111,203,0" VerticalAlignment="Top">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <ei:ChangePropertyAction TargetObject="{Binding ElementName=image}" PropertyName="Source">
                        <ei:ChangePropertyAction.Value>
                            <ImageSource>http://images/rrr.jpg</ImageSource>
                        </ei:ChangePropertyAction.Value>
                    </ei:ChangePropertyAction>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>



--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
DenWPF
Дата 9.6.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



в бленде сила)
PM MAIL   Вверх
DenWPF
Дата 9.6.2011, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Не сильно работает ))

Если картинка есть, то показывается, если её нет ил что то не так, то не чего не показывается.

И если не сложно, объясни как в бленде делать то что ты сделал. "<i:Interaction.Triggers>"

Код

<Image MaxHeight="50" x:Name="image" Source="{Binding photo}">
                                            <i:Interaction.Triggers>
                                                <i:EventTrigger EventName="ImageFailed">
                                                    <ei:ChangePropertyAction PropertyName="Source">
                                                        <ei:ChangePropertyAction.Value>
                                                            <ImageSource>http://i1.i.ua/prikol/pic/8/4/427148.jpg</ImageSource>
                                                        </ei:ChangePropertyAction.Value>
                                                    </ei:ChangePropertyAction>
                                                </i:EventTrigger>
                                            </i:Interaction.Triggers>
                                        </Image>

PM MAIL   Вверх
-Mikle-
Дата 9.6.2011, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Работает отлично, я же проверял.

Код

<Image MaxHeight="50" x:Name="image" Source="{Binding photo}">
                                            <i:Interaction.Triggers>
                                                <i:EventTrigger EventName="ImageFailed">
                                                    <ei:ChangePropertyAction PropertyName="Source">
                                                        <ei:ChangePropertyAction.Value>

                                                            ВОТ ЭТО ДОЛЖНА БЫТЬ ДЕФОЛТОВАЯ КАРТИНКА, КОТОРУЮ ЛУЧШЕ ДАЖЕ ПОЛОЖИТЬ ВНУТРЬ *.ХАР
                                                            <ImageSource>http://i1.i.ua/prikol/pic/8/4/427148.jpg</ImageSource>

                                                        </ei:ChangePropertyAction.Value>
                                                    </ei:ChangePropertyAction>
                                                </i:EventTrigger>
                                            </i:Interaction.Triggers>
                                        </Image>



Добавлено через 1 минуту и 50 секунд
Цитата(DenWPF @  9.6.2011,  14:00 Найти цитируемый пост)
И если не сложно, объясни как в бленде делать то что ты сделал. "<i:Interaction.Triggers>"

Это лучше тебе пару уроков посмотреть по бленду. Вроде все не сложно, но не знаю как сформулировать правильно, чтоб ты понял. Придется скрины нарезать или видео заснять, а времени на это у меня нет.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
DenWPF
Дата 9.6.2011, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Все тот же эффект, даже не дергается когда картинки нет.
Пишу под SL4 

А какими видео ты пользуешься?
PM MAIL   Вверх
-Mikle-
Дата 9.6.2011, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 13
Всего: 59



Цитата(DenWPF @  9.6.2011,  16:34 Найти цитируемый пост)
А какими видео ты пользуешься?

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

Вот тебе проект. Возможно, ты не видишь эффекта потому, что хочешь его быстро получить. После нажатия кнопки "НЕ правильная" проходит определенное время (1-3 секунды) прежде, чем появится no image. Это связано с тем, что невозможно получить мгновенный результат из интернета. Идет запрос и Image ожидает ответа.


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  SilverlightApplication1.zip 87,50 Kb


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
DenWPF
Дата 9.6.2011, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Нашел проблему, если при байдинге null. то не будет работать.
Пришлось все таки использовать конвертор, что бы проверять если null то возвращать http://images/rrr.jpg )) 

и даже лучше, что бы не ждать пока определит есть ли по пути картинка, путь нужно сделать без http, т.е локальный, т.е я вообще возвращаю "abracadabra".

Это сообщение отредактировал(а) DenWPF - 9.6.2011, 15:24
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.