Category Archives: SilverLight

Курсы доллара и евро: гаджет для висты

Давненько хотел написать какой нить гаджет для висты. Изначально хотел сделать это на WPF, но выяснилось что к гаджетам у микрософта другой подход. Посути гаджет – это html веб страница со всеми вытекающим. Поэтому только xbap или silverlight можно засунуть в гаджет (причем стало это можно сделать относительно недавно).

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

Попытка использовать сильверлайт закончилась неудачно. Во первых, под 64-битной вистой сильверлайт не работает в 64-битном сайдбаре. Это можно обойти, запуская 32-ух битную версию сайдбара, но это уже извращение. Во вторых, из сильверлайта в гаджете нельзя нормально обратиться к вебсервису. Это связано с тем, что сильверлайт в гаджете не видит конфигурационных xml файлов и не может получить доступ. Есть workaround, который передает данные в сильверлайт контрол через скрипт AJAX, но я считаю это не очень красивым. 

В итоге я сделал проще – гаджет просто показывает картинку с вебсервера, обновляя ее раз в час. А на сервере работает php скрипт по крону, который запрашивает данные у центробанка. Гаджет показывает текущий курс бакса и евро, на сколько он изменился за день и за неделю и график динамики курсов за 3 недели. 

Гаджет курса валют ЦБ для висты

Скачать гаджет

Просто запустите скаченный файл, и гаджет установится. Если этого не произойдет и он откроется как зип архив, то можно на гаджете нажaть Open with… Sidebar. Если и это не поможет, то можно создать папку C:\Users\Ваше имя\AppData\Local\Microsoft\Windows Sidebar\Gadgets\CurrencyRates.gadget\ и в нее скопировать содержимое архива. 

WPF и DPI

Не для кого не секрет, что в Висте можно менять DPI (dots-per-inch) для более удобной работы на мониторах с большим разрешением. Я не мог и подумать, что это может проявиться самым неожиданным образом при просмотре изображений под WPF. Любое изображение (обыкновенный JPEG) может нести в себе информацию о DPI внутри метаданных. По умолчанию равно 96 и именно это значение будет использоваться если данных нет.

Однако, некоторые программы для обработки фотографий решили, что неплохо бы 180 dpi прописать в jpg файлы. Если открыть такую фотку в классе Image, то размер ее окажется раза в два меньше ваших ожиданий (естественно, имеется ввиду режим без растяжения Stretch.None). И это еще пол беды. Хотя DPI у изображения в явном виде выставить нельзя, но можно обойти эту проблему либо использовав класс DrawingImage, либо получив PixelData и сгенерировав новый битмап из нее.

Далее меня ждал еще один сюрприз. Если выравнивание фотографии стоит по центру и разрешение ее не кратно двум, то мы получаем мыло изза того что центр изображения попадает между пикселами. Особенно это заметно при просмотре скриншетов текста. Опция SnapsToDevicePixels=Trueне помогает ничем! Пришлось в зависимости от кратности разрешения изображения изменять маргин на 1. В общем, еще то извращение, но прекрасно работает.

В завершении скажу, что пока искал решение вышеописанных проблем, наткнулся на блог, где написано, что вообще не стоит в wpf и silverlight использовать картинки с плохой масштабируемостью, то есть качество которых страдает от небольшого ресайза. Речь идет о любых изображениях с четкими гранями и текстом! Так что be aware!

Картинки в Silverlight и глюк Firefox

Обнаружил недавно глюк с отображением картинок в Firefox’е. Одно единственное изображение, которое я использовал в качестве исходного фона для таблицы цветов, не показывалось вообще. Я решил, что я что то делаю не правильно и покопался на на тему как правильно грузить картинки. Нашел три варианта, помимо просто указания файла в XAML коде:

Просто выставление свойства:

CoolImage.SetValue(Image.SourceProperty, "bg.jpg");

Динамический XAML:

CoolImage = (Image)XamlReader.Load(@"<Image Source=bg.jpg'>");

И, наконец, вариант с даунлоадером (наиболее гибкий):

Downloader loader = new Downloader();

// Subscribe to the downloaded event
loader.Completed += new EventHandler(DownloadCompleted);

// Download the image
loader.Open("GET", new Uri("bg.jpg", UriKind.Relative));
loader.Send();

//......................

private void DownloadCompleted(object sender, EventArgs e)
{
            CoolImage.SetSource(sender as Downloader, "");
}

Последний вариант самый оптимальный, так как позволяет контролировать весь процесс загрузки. Я добавил этот код в тест с цветами, но в Firefox картинка так и не отобразилась. Надеюсь это поправят уже к бета версии Silverlight.

Как заставить контролы Dave Relyea работать в Silverlight 1.1 Alpha Refresh

[ratings] Любой кто решит написать на Silverlight что-нибудь серьезное сейчас столкнется с проблемой поиска или написания своих контролов (TextBox, Button, etc). Так как свои контролы сейчас писать почему-то не хотелось я порылся в поисках готовых контролов в сети. Оказалось есть лишь 2 достойных альтернативы в данный момент, хотя они обе мне не нравятся:

Во первых, это – http://www.netikatech.com/ – Реализация WinForms для Silverlight и Flash. Но мне хотелось получить контролы WPF, а не WinForms.

Во вторых, это – контролы, которые реализовал Dave Relyea и выложил тут. Тут очень ограниченный набор, но хотя бы есть Grid и StackPanel. Это не полноценный набор, но для экспериментов с Alpha версией вполне сойдет.

Continue reading

Поиск книг на Silverlight

Наткнулся на отличный пример использования SilverLight: Поиск книг на Амазоне (Для просмотра нужно установить Microsoft Silverlight 1.1 Alpha Refresh)

Это приложение использует поисковое апи амазона для поиска книг схожих по тематике и показывает их связи друг с другом. Проще поиграться с этим примером, чтоб понять удобство подобного поиска. В дополнение ко всему этому прикручена физика Rag-doll.

Прочитать подробнее о примере можно тут. Там же есть ссылка на исходные тексты проекта.

Continue reading

140 цветов SilverLight

[ratings] Сразу после релиза новой версии Visual Studio вышла новая версия SilverLight 1.1 Alpha Refresh. Именно с этой версии я решил начать свое знакомство с SilverLight. Первое впечатление было несколько негативным, так как в SilverLight не оказалось многих вещей, которые я привык использовать в полноценном WPF. Например, в этой версии отсутствуют даже стандартные контролы для интерфейса. Надеюсь, все это будет дополнено к финальной версии, но на данный момент выбор XBap или SilverLight все еще очень актуален. Но уже стало очевидно, что будущее именно за SilverLight. Уже сейчас SilverLight поддерживает не только большинство браузеров на Windows и MacOS, но и даже под Mono группа отдельных разработчиков реализовала его поддержку.

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

Вот что в итоге получилось: таблица

При нажатии на любой цвет фон окрасится в него.

Дополнение:
Для просмотра нужно установить Microsoft Silverlight 1.1 Alpha RefreshMac или Windows. Автоматом сейчас ставится только SilverLight 1.0 RC1.

Continue reading