SilverLight – Victor Laskin's Blog http://vitiy.info Programming, architecture and design (С++, QT, .Net/WPF, Android, iOS, NoSQL, distributed systems, mobile development, image processing, etc...) Fri, 05 Sep 2008 10:33:00 +0000 en-US hourly 1 https://wordpress.org/?v=5.4.2 Курсы доллара и евро: гаджет для висты http://vitiy.info/%d0%ba%d1%83%d1%80%d1%81%d1%8b-%d0%b4%d0%be%d0%bb%d0%bb%d0%b0%d1%80%d0%b0-%d0%b8-%d0%b5%d0%b2%d1%80%d0%be-%d0%b3%d0%b0%d0%b4%d0%b6%d0%b5%d1%82-%d0%b4%d0%bb%d1%8f-%d0%b2%d0%b8%d1%81%d1%82%d1%8b/ http://vitiy.info/%d0%ba%d1%83%d1%80%d1%81%d1%8b-%d0%b4%d0%be%d0%bb%d0%bb%d0%b0%d1%80%d0%b0-%d0%b8-%d0%b5%d0%b2%d1%80%d0%be-%d0%b3%d0%b0%d0%b4%d0%b6%d0%b5%d1%82-%d0%b4%d0%bb%d1%8f-%d0%b2%d0%b8%d1%81%d1%82%d1%8b/#comments Fri, 05 Sep 2008 10:30:57 +0000 http://vitiy.info/?p=50 Давненько хотел написать какой нить гаджет для висты. Изначально хотел сделать это на 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\ и в нее скопировать содержимое архива. 

]]>
http://vitiy.info/%d0%ba%d1%83%d1%80%d1%81%d1%8b-%d0%b4%d0%be%d0%bb%d0%bb%d0%b0%d1%80%d0%b0-%d0%b8-%d0%b5%d0%b2%d1%80%d0%be-%d0%b3%d0%b0%d0%b4%d0%b6%d0%b5%d1%82-%d0%b4%d0%bb%d1%8f-%d0%b2%d0%b8%d1%81%d1%82%d1%8b/feed/ 21
WPF и DPI http://vitiy.info/wpf-%d0%b8-dpi/ http://vitiy.info/wpf-%d0%b8-dpi/#respond Fri, 28 Dec 2007 19:56:14 +0000 http://vitiy.info/?p=28 Не для кого не секрет, что в Висте можно менять DPI (dots-per-inch) для более удобной работы на мониторах с большим разрешением. Я не мог и подумать, что это может проявиться самым неожиданным образом при просмотре изображений под WPF. Любое изображение (обыкновенный JPEG) может нести в себе информацию о DPI внутри метаданных. По умолчанию равно 96 и именно это значение будет использоваться если данных нет.

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

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

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

]]>
http://vitiy.info/wpf-%d0%b8-dpi/feed/ 0
Картинки в Silverlight и глюк Firefox http://vitiy.info/%d0%ba%d0%b0%d1%80%d1%82%d0%b8%d0%bd%d0%ba%d0%b8-%d0%b2-silverlight-%d0%b8-%d0%b3%d0%bb%d1%8e%d0%ba-firefox/ http://vitiy.info/%d0%ba%d0%b0%d1%80%d1%82%d0%b8%d0%bd%d0%ba%d0%b8-%d0%b2-silverlight-%d0%b8-%d0%b3%d0%bb%d1%8e%d0%ba-firefox/#respond Mon, 06 Aug 2007 12:01:50 +0000 http://vitiy.info/?p=16 Обнаружил недавно глюк с отображением картинок в 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.

]]>
http://vitiy.info/%d0%ba%d0%b0%d1%80%d1%82%d0%b8%d0%bd%d0%ba%d0%b8-%d0%b2-silverlight-%d0%b8-%d0%b3%d0%bb%d1%8e%d0%ba-firefox/feed/ 0
Как заставить контролы Dave Relyea работать в Silverlight 1.1 Alpha Refresh http://vitiy.info/%d0%ba%d0%b0%d0%ba-%d0%b7%d0%b0%d1%81%d1%82%d0%b0%d0%b2%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8b-dave-relyea-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d1%82%d1%8c-%d0%b2-silverlig/ http://vitiy.info/%d0%ba%d0%b0%d0%ba-%d0%b7%d0%b0%d1%81%d1%82%d0%b0%d0%b2%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8b-dave-relyea-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d1%82%d1%8c-%d0%b2-silverlig/#respond Sat, 04 Aug 2007 10:47:35 +0000 http://vitiy.info/?p=15 [ratings] Любой кто решит написать на Silverlight что-нибудь серьезное сейчас столкнется с проблемой поиска или написания своих контролов (TextBox, Button, etc). Так как свои контролы сейчас писать почему-то не хотелось я порылся в поисках готовых контролов в сети. Оказалось есть лишь 2 достойных альтернативы в данный момент, хотя они обе мне не нравятся:

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

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

Контролы Дейва были написаны еще для первой альфа версии, поэтому чтобы они заработали нужно проделать некие манипуляции. А именно всего одну: в Alpha Refresh версии зачем то решили выкинуть Visibility.Hidden, а оставить только Visibility.Collapsed, под предлогом, что все равно сейчас работают одинаково. Поэтому нужно просто заменить Hidden на Collapsed и все начнет работать.

Также я столкнулся с ошибкой AG_E_INVALID_ARGUMENT 2210 Error, которая возникает при неправильном указании ресурсов. Для того чтоб все заработало нужно в свойствах Xaml файлов контролов указать, что они являются Embedded Resource:

А также заменить во всех вызовах функции GetManifestResourceStream аргумент на строку формата “Namespace.folder.xamlfile”. Например:

public TextBox()
     {
           System.IO.Stream s = this.GetType().Assembly.GetManifestResourceStream("MyTest.Controls.TextBox.xaml");
           //.....

После этих операций у меня все заработало.

]]>
http://vitiy.info/%d0%ba%d0%b0%d0%ba-%d0%b7%d0%b0%d1%81%d1%82%d0%b0%d0%b2%d0%b8%d1%82%d1%8c-%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8b-dave-relyea-%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%b0%d1%82%d1%8c-%d0%b2-silverlig/feed/ 0
Поиск книг на Silverlight http://vitiy.info/%d0%bf%d0%be%d0%b8%d1%81%d0%ba-%d0%ba%d0%bd%d0%b8%d0%b3-%d0%bd%d0%b0-silverlight/ http://vitiy.info/%d0%bf%d0%be%d0%b8%d1%81%d0%ba-%d0%ba%d0%bd%d0%b8%d0%b3-%d0%bd%d0%b0-silverlight/#respond Thu, 02 Aug 2007 16:14:19 +0000 http://vitiy.info/?p=14 Наткнулся на отличный пример использования SilverLight: Поиск книг на Амазоне (Для просмотра нужно установить Microsoft Silverlight 1.1 Alpha Refresh)

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

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

Следует отметить, что автор пишет, что доволен скоростью работы даже на медленных машинах:

On the plus side, I was impressed by Silverlight’s rendering speed even at this early stage in its development, as I went out of my way to fill the whole screen up with as many shiny gradients and subtle animations as possible (in addition to the physics modelling) and it still ran along at a decent clip and was responsive to user input even on lower spec machines.

Это не может не радовать.

]]>
http://vitiy.info/%d0%bf%d0%be%d0%b8%d1%81%d0%ba-%d0%ba%d0%bd%d0%b8%d0%b3-%d0%bd%d0%b0-silverlight/feed/ 0
140 цветов SilverLight http://vitiy.info/140-%d1%86%d0%b2%d0%b5%d1%82%d0%be%d0%b2-silverlight/ http://vitiy.info/140-%d1%86%d0%b2%d0%b5%d1%82%d0%be%d0%b2-silverlight/#comments Tue, 31 Jul 2007 11:24:22 +0000 http://vitiy.info/?p=13 [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.

При генерации этой таблички выяснилось, что в SilverLight отсутствует класс Brushes – набор кистей, которые можно извлекать по имени в WPF. Поэтому я создал свой класс:

//System.Windows.Media.Brushes ------ Нету в SilverLight 1.1 Alpha Refresh!
    public class SilverlightBrushes
    {
        public static string[] ColorNames = new string[141] { "AliceBlue", "AntiqueWhite", "Aqua", "AquaMarine", "Azure", "Beige", "Bisque", "Black", "BlanchedAlmond", "Blue", "BlueViolet", "Brown", "BurlyWood", "CadetBlue", "Chartreuse", "Chocolate", "Coral", "CornflowerBlue", "Cornsilk", "Crimson", "Cyan", "DarkBlue", "DarkCyan", "DarkGoldenrod", "DarkGray", "DarkGreen", "DarkKhaki", "DarkMagenta", "DarkOliveGreen", "DarkOrange", "DarkOrchid", "DarkRed", "DarkSalmon", "DarkSeaGreen", "DarkSlateBlue", "DarkSlateGray", "DarkTurquoise", "DarkViolet", "DeepPink", "DeepSkyBlue", "DimGray", "DodgerBlue", "Firebrick", "FloralWhite", "ForestGreen", "Fuchsia", "Gainsboro", "GhostWhite", "Gold", "Goldenrod", "Gray", "Green", "GreenYellow", "Honeydew", "HotPink", "IndianRed", "Indigo", "Ivory", "Khaki", "Lavender", "LavenderBlush", "LawnGreen", "LemonChiffon", "LightBlue", "LightCoral", "LightCyan", "LightGoldenrodYellow", "LightGray", "LightGreen", "LightPink", "LightSalmon", "LightSeaGreen", "LightSkyBlue", "LightSlateGray", "LightSteelBlue", "LightYellow", "Lime", "LimeGreen", "Linen", "Magenta", "Maroon", "MediumAquamarine", "MediumBlue", "MediumOrchid", "MediumPurple", "MediumSeaGreen", "MediumSlateBlue", "MediumSpringGreen", "MediumTurquoise", "MediumVioletRed", "MidnightBlue", "MintCream", "MistyRose", "Moccasin", "NavajoWhite", "Navy", "OldLace", "Olive", "OliveDrab", "Orange", "OrangeRed", "Orchid", "PaleGoldenrod", "PaleGreen", "PaleTurquoise", "PaleVioletRed", "PapayaWhip", "PeachPuff", "Peru", "Pink", "Plum", "PowderBlue", "Purple", "Red", "RosyBrown", "RoyalBlue", "SaddleBrown", "Salmon", "SandyBrown", "SeaGreen", "SeaShell", "Sienna", "Silver", "SkyBlue", "SlateBlue", "SlateGray", "Snow", "SpringGreen", "SteelBlue", "Tan", "Teal", "Thistle", "Tomato", "Transparent", "Turquoise", "Violet", "Wheat", "White", "WhiteSmoke", "Yellow", "YellowGreen" };
        public static string[] Colors = new string[141] { "#FFF0F8FF", "#FFFAEBD7", "#FF00FFFF", "#FF7FFFD4", "#FFF0FFFF", "#FFF5F5DC", "#FFFFE4C4", "#FF000000", "#FFFFEBCD", "#FF0000FF", "#FF8A2BE2", "#FFA52A2A", "#FFDEB887", "#FF5F9EA0", "#FF7FFF00", "#FFD2691E", "#FFFF7F50", "#FF6495ED", "#FFFFF8DC", "#FFDC143C", "#FF00FFFF", "#FF00008B", "#FF008B8B", "#FFB8860B", "#FFA9A9A9", "#FF006400", "#FFBDB76B", "#FF8B008B", "#FF556B2F", "#FFFF8C00", "#FF9932CC", "#FF8B0000", "#FFE9967A", "#FF8FBC8F", "#FF483D8B", "#FF2F4F4F", "#FF00CED1", "#FF9400D3", "#FFFF1493", "#FF00BFFF", "#FF696969", "#FF1E90FF", "#FFB22222", "#FFFFFAF0", "#FF228B22", "#FFFF00FF", "#FFDCDCDC", "#FFF8F8FF", "#FFFFD700", "#FFDAA520", "#FF808080", "#FF008000", "#FFADFF2F", "#FFF0FFF0", "#FFFF69B4", "#FFCD5C5C", "#FF4B0082", "#FFFFFFF0", "#FFF0E68C", "#FFE6E6FA", "#FFFFF0F5", "#FF7CFC00", "#FFFFFACD", "#FFADD8E6", "#FFF08080", "#FFE0FFFF", "#FFFAFAD2", "#FFD3D3D3", "#FF90EE90", "#FFFFB6C1", "#FFFFA07A", "#FF20B2AA", "#FF87CEFA", "#FF778899", "#FFB0C4DE", "#FFFFFFE0", "#FF00FF00", "#FF32CD32", "#FFFAF0E6", "#FFFF00FF", "#FF800000", "#FF66CDAA", "#FF0000CD", "#FFBA55D3", "#FF9370DB", "#FF3CB371", "#FF7B68EE", "#FF00FA9A", "#FF48D1CC", "#FFC71585", "#FF191970", "#FFF5FFFA", "#FFFFE4E1", "#FFFFE4B5", "#FFFFDEAD", "#FF000080", "#FFFDF5E6", "#FF808000", "#FF6B8E23", "#FFFFA500", "#FFFF4500", "#FFDA70D6", "#FFEEE8AA", "#FF98FB98", "#FFAFEEEE", "#FFDB7093", "#FFFFEFD5", "#FFFFDAB9", "#FFCD853F", "#FFFFC0CB", "#FFDDA0DD", "#FFB0E0E6", "#FF800080", "#FFFF0000", "#FFBC8F8F", "#FF4169E1", "#FF8B4513", "#FFFA8072", "#FFF4A460", "#FF2E8B57", "#FFFFF5EE", "#FFA0522D", "#FFC0C0C0", "#FF87CEEB", "#FF6A5ACD", "#FF708090", "#FFFFFAFA", "#FF00FF7F", "#FF4682B4", "#FFD2B48C", "#FF008080", "#FFD8BFD8", "#FFFF6347", "#00FFFFFF", "#FF40E0D0", "#FFEE82EE", "#FFF5DEB3", "#FFFFFFFF", "#FFF5F5F5", "#FFFFFF00", "#FF9ACD32" };

        public static Brush GetFromName(string ColorName)
        {
            Color c = new Color();
            for (int i = 0; i < 141; i++)
                if (ColorName == ColorNames[i])
                {
                    string cbytes = Colors[i];
                   
                    string a = cbytes.Substring(1, 2);
                    string r = cbytes.Substring(3, 2);
                    string g = cbytes.Substring(5, 2);
                    string b = cbytes.Substring(7, 2);
                                       
                    c = Color.FromArgb(byte.Parse(a, NumberStyles.HexNumber), byte.Parse(r, NumberStyles.HexNumber), byte.Parse(g, NumberStyles.HexNumber), byte.Parse(b, NumberStyles.HexNumber));
                }

            return new SolidColorBrush(c);
        }
   
    }

Он возвращает цвет по имени:

tb.Foreground = SilverlightBrushes.GetFromName("LightGray");

Может этот класс будет кому-то полезен.

]]>
http://vitiy.info/140-%d1%86%d0%b2%d0%b5%d1%82%d0%be%d0%b2-silverlight/feed/ 1