<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://dev.net.ua/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang=""><title type="html">Женя Золотько о WPF и разработке GUI вообще</title><subtitle type="html" /><id>http://dev.net.ua/blogs/e-zolotko/atom.aspx</id><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/default.aspx" /><link rel="self" type="application/atom+xml" href="http://dev.net.ua/blogs/e-zolotko/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.60809.935">Community Server</generator><updated>2006-10-18T18:04:00Z</updated><entry><title>Custom ListView Style, большой источник данных - вопросы производительности</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2008/02/15/5408.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2008/02/15/5408.aspx</id><published>2008-02-15T15:05:00Z</published><updated>2008-02-15T15:05:00Z</updated><content type="html">&lt;P&gt;Я захотел сделать свой стиль для ListView - это не так сложно:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Style TargetType="{x:Type local:MyListView}"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="ScrollViewer.HorizontalScrollBarVisibility"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value="Auto"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="ScrollViewer.VerticalScrollBarVisibility"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value="Auto"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter Property="Template"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter.Value&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ControlTemplate TargetType="{x:Type local:MyListView}"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ScrollViewer&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ScrollViewer&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ControlTemplate&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Setter.Value&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Setter&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Style&amp;gt;&lt;/P&gt;
&lt;P&gt;Но возникла проблема - в момент привязки сравнительно большого источника данных (5000 элементов) происходила значительная задержка (4 секунды); при использовании стандартного стиля все работало очень быстро.&lt;/P&gt;
&lt;P&gt;После нескольких часов творческого поиска я обнаружил, что проблема решается при помощи свойства ScrollViewer.CanContentScroll следующим образом:&lt;/P&gt;
&lt;P&gt;&amp;lt;Setter Property="ScrollViewer.CanContentScroll"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Value="true"/&amp;gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;Проблема состояла в том, что при использовании моего стиля ScrollViewer работал в режиме физического (то есть "попиксельного") скроллинга (CanContentScroll == false). Естественно, в этом режиме контейнеру нужно знать суммарную высоту содержимого - на эти измерения (строк) тратилось время при привязке, что и выяснилось при помощи профайлера.&lt;/P&gt;
&lt;P&gt;Устанавливая CanContentScroll в true, мы включаем логический ("поэлементный") режим скроллинга. В таком режиме скроллинг происходит в "виртуальной" манере, и измеряется высота только видимых элементов - задержки нет. Заинтересовавшиеся этим вопросом могут исследвать интерфейс &lt;SPAN class=selflink&gt;IScrollInfo.&lt;/SPAN&gt;&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=5408" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /><category term="Binding" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/Binding/default.aspx" /><category term="ScrollViewer" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/ScrollViewer/default.aspx" /><category term="ListView" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/ListView/default.aspx" /></entry><entry><title>Решение проблемы с нечеткими растрами в WPF</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2008/02/03/5302.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2008/02/03/5302.aspx</id><published>2008-02-03T13:47:00Z</published><updated>2008-02-03T13:47:00Z</updated><content type="html">&lt;DIV&gt;
&lt;P&gt;Известно, что в текущей версии WPF существует проблема с качеством отображения растров. Возникает она из-за того, что WPF отображает визуальные элементы исходя из координат и размеров в логических единицах (долях дюйма) без точной привязки к пикселам. То есть, по умолчанию, растровое изображение в WPF-приложении будет иметь одинаковый размер в логических единицах на мониторе с разрешением 96 DPI и на супер-мониторе с разрешением 300 DPI. Теоретически это звучит хорошо, но на практике дело обстоит иначе.&lt;/P&gt;
&lt;P&gt;Растровые изображения являются основным элементом пиксельной графики. Это означает, что эти избражения тесно связаны с пиксельной природой устройств, для использования на которых они предназначены. Точно также, как игра в «морской бой» связана с клетками на тетрадном листе. Таким образом, если начать играть в независимость пиксельных изображений от собственно пикселей, мы получим размытую картинку на мониторе. Что мы и имеем в современных WPF-приложениях.&lt;/P&gt;
&lt;P&gt;На самом деле, есть случаи, когда такое положение вещей допустимо. Например, растянутая на фоне элемента управления текстура с размытыми цветами, и тому подобное. Но в большинстве случаев, когда растры используются для картинок в кнопках на панелях управления, меню (16х16, 32х32 пикселя), и так далее, это не годится; картинки размыты, приложение неумолимо теряет профессиональный вид.&lt;/P&gt;
&lt;P&gt;Это не устраивает многих разработчиков, и обсуждение этой темы обычно заканчивается бессильными протестами в сторону создателей платформы. Но, к счастью, &lt;A href="http://blogs.msdn.com/dwayneneed/default.aspx"&gt;MSDN-блоггером&lt;/A&gt; было предложено решение этой проблемы. В &lt;A href="http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx"&gt;статье&lt;/A&gt; описывается класс Bitmap, который позволяет отображать растры с точной пиксельной привязкой к целевому устройству. Используйте этот класс, и ваши растры будут вылядеть как родные! При этом, естественно на супер-мниторе с 300 DPI ваша картинка будет выглядеть крошечной. Но на то они и растры, я считаю. Примяняйте векторные изображения, и с масштабированием все будет отлично. &lt;/P&gt;
&lt;P&gt;Прекрасно, но существует проблема, которая не позволяет использовать этот класс в случаях, когда нужно осущеcтвить привязку к данным через DataContext. Я столкнулся с этим при написании CellTemplate для ListView. Предполагалось, что ячейка будет содержать растровое избражение, привязанное к пикселам. &lt;BR&gt;&lt;/P&gt;Но это, к сожалению, не работало. Возникало исключение, смысл которого в том, что наследование DataContext работает только для классов, производных от FrameworkElement. В то же время, наш американский товарищ унаследовал свой класс Bitmap от UIElement, потому что только так можно перекрыть методы, которые являются sealed для наследников FrameworkElement. 
&lt;P&gt;Использовать класс очень хотелось, и мне пришлось сделать обертку вокруг Bitmap, порожденную от FrameworkElement. Для того, чтобы это выглядело прозрачно, я перекрыл визуальное дерево элемента и встроил в него реализацию, выполненную ранее. Моя обертка тоже называется Bitmap, а внутренний класс, который выполняет собственно привязку к пикселам, я переименовал в BitmapUIElement.&lt;/P&gt;
&lt;P&gt;Чтобы проиллюстрировать все это, я сделал небольшой &lt;A href="http://cid-1c86d355e7695683.skydrive.live.com/self.aspx/Public/SnappingBitmapToPixelsDemo.zip"&gt;пример&lt;/A&gt;. В нем используется ListView для отображения всех файлов из папки System32 – имена и иконки 32х32. Обратите внимание, что иконки выглядят так же качественно, как в Explorer.&lt;/P&gt;
&lt;P style="LINE-HEIGHT:normal;"&gt;Вот, собственно, и все. В заключение еще раз скажу, что если у вас есть возможность использовать векторные изображения, то лучше используйте их.&lt;/P&gt;&lt;/DIV&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=5302" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /><category term="нечеткий" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/_3D0435044704350442043A0438043904_/default.aspx" /><category term="размытый" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/_4004300437043C044B0442044B043904_/default.aspx" /><category term="bitmaps" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/bitmaps/default.aspx" /><category term="растр" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/_40043004410442044004_/default.aspx" /><category term="blurry" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/blurry/default.aspx" /></entry><entry><title>Компоненты .NET Framework 3.0 RTM доступны для скачивания</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2006/11/07/371.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2006/11/07/371.aspx</id><published>2006-11-07T08:02:00Z</published><updated>2006-11-07T08:02:00Z</updated><content type="html">&lt;P&gt;Для тех, кто еще не знает:&lt;/P&gt;
&lt;P&gt;Выпущена Release-to-manufacture версия .NET Framework 3.0; все ссылки &lt;A href="http://www.netfx3.com/blogs/news_and_announcements/archive/2006/11/06/.NET-Framework-3.0-has-been-released_2100_.aspx"&gt;здесь&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Как говорится в таких случаях, поехали! Делайте приложения, господа.&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=371" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /><category term=".NET Framework" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/.NET+Framework/default.aspx" /></entry><entry><title>Задание значений свойств в XAML с использованием объединения флагов по ИЛИ</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2006/11/03/314.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2006/11/03/314.aspx</id><published>2006-11-03T05:00:00Z</published><updated>2006-11-03T05:00:00Z</updated><content type="html">&lt;P&gt;Для того, чтобы задать значение свойства путем комбинации двоичных флагов в XAML, имена необходимых элементов нужно перечислить через запятую.&lt;/P&gt;
&lt;P&gt;Например,&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#330000&gt;// C#&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#330000&gt;MyType myObject = new MyType();&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#330000&gt;myObject.MyFlags = MyTypeFlags.Flag1 | MyTypeFlags.Flag2 | MyTypeFlags.Flag3;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#330000&gt;// XAML&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New" color=#330000&gt;&amp;lt;MyType MyFlags=“Flag1, Flag2, Flag3“ /&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Как видите, здесь все просто. Вот только проблема в том, что разработчики не включили в документацию по WPF описание этой возможности. Для того, чтобы понять как это сделать, нужно обладать знаниями по работе метода Enum.Parse(), которые в общем выражаются следующим образом (текст из документации по Enum):&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#006600&gt;“You can use the static &lt;B&gt;Parse&lt;/B&gt; method to initialize a &lt;B&gt;Boolean&lt;/B&gt; type to the value of a string. This method accepts the enumeration type you are parsing, the string to parse, and an optional Boolean flag indicating whether or not the parse is case-sensitive. The string you are parsing can contain several values separated by commas, which can be preceded or followed by one or more empty spaces (also called white spaces). When the string contains multiple values, the value of the returned object is the value of all specified values combined with a bitwise OR operation.”&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Таким образом, эта функциональность вообще не была специально реализована в WPF, а просто «наследуется» от базовой библиотеки типов. Видимо, поэтому это и не описано явно в документации по WPF, но хотелось бы, чтобы ситуация изменилась.&lt;/FONT&gt;&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=314" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /><category term="XAML" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/XAML/default.aspx" /></entry><entry><title>Мои доклады по WPF на Днях Разработчика 2006 в Украине</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2006/10/31/243.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2006/10/31/243.aspx</id><published>2006-10-30T21:04:00Z</published><updated>2006-10-30T21:04:00Z</updated><content type="html">&lt;A href="http://www.microsoft.com/Ukraine/Events/DevelopersDaysAutumn2006/default.mspx"&gt;На этой странице&lt;/A&gt; находится расписание осенних Дней Разработчика 2006 в Украине. Эти мероприятия будут проходить в Харкове, Донецке, Днепропетровске, Киеве, Львове, Одессе, Николаеве, Запорожье, Ровно, Виннице и Ивано-Франковске. 
&lt;P&gt;Я прочту доклады по WPF в Харкове, Львове, Одессе, Николаеве, Виннице, Ивано-Франковске. 
&lt;P&gt;Первое мероприятие в Симферополе уже успешно прошло, и я получил от него самые положительные впечатления. Так что рекомендую посетить, если у вас будет возможность.&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=243" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="DevDays" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/DevDays/default.aspx" /><category term="Дни разработчика" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/_14043D043804_+_4004300437044004300431043E044204470438043A043004_/default.aspx" /></entry><entry><title>Архитектура WPF. Dependency Properties</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_1004400445043804420435043A044204430440043004_-WPF.-Dependency-Properties.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_1004400445043804420435043A044204430440043004_-WPF.-Dependency-Properties.aspx</id><published>2006-10-18T15:17:00Z</published><updated>2006-10-18T15:17:00Z</updated><content type="html">&lt;P&gt;Известно, что CLR дает возможность использовать в качестве членов классов свойства с параметрами или без. Например, в C# мы можем воспользоваться этим для создания get- и/или set- элементов для членов-данных и индексаторов с различным количеством параметров. Лаконичный синтаксис таких свойств весьма удобен и везде используется. &lt;/P&gt;
&lt;P&gt;В контексте WPF ситуация обстоит таким образом, что в некоторых случаях функциональности обычных свойств недостаточно. Причины этого следующие: &lt;/P&gt;
&lt;P&gt;
&lt;UL&gt;
&lt;LI&gt;Иногда возникает необходимость наследования значений свойств в порядке отношений «родитель-ребенок» логического дерева. Например, если для родительской панели задан красный цвет фона, то такой цвет фона должны иметь и дочерние кнопки. Такая функциональность в разной степени реализована в Windows Forms и ActiveX (Ambient Properties); эти реализации довольно противоречивы, неполны и их практически невозможно использовать прикладному программисту. 
&lt;LI&gt;Часто у клиентов какого-либо класса возникает потребность в отслеживании событий о изменении какого-либо свойства, не имея информации о конкретном свойстве (например, нужно отслеживать значение цвета фона, не имея сведений о наличии события BackColorChanged). Одним из способов достижения этого является использование стандартного интерфейса INotifyPropertyChanged, который находится в пространстве имен System.ComponentModel и содержит единственное событие PropertyChanged, аргументы которого включают имя измененного свойства в форме обычной строки. 
&lt;LI&gt;Встречаются случаи, когда для реализации определенной подсистемы необходимы механизмы работы на метауровне наподобие Reflection, но очень быстрые. Тогда обычно применяются не очень-то элегантные решения типа Property Bags, сделанных на ассоциативных массивах и другие подобные вещи. &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;В качестве архитектурно целостного и элегантного решения этих и некоторых других проблем WPF вводит концепцию Dependency Properties (для себя я не нашел однозначно корректного перевода этого термина на русский язык, так что буду упоминать его в оригинале). &lt;/P&gt;
&lt;P&gt;На базе Dependency Properties реализованы следующие подсистемы WPF: &lt;/P&gt;
&lt;P&gt;
&lt;UL&gt;
&lt;LI&gt;Cтили 
&lt;LI&gt;Data Binding 
&lt;LI&gt;Наследование свойств в логическом дереве 
&lt;LI&gt;Анимация свойств 
&lt;LI&gt;Расширения разметки XAML 
&lt;LI&gt;Layout визуальных элементов и другое &lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;Dependency Properties можно рассматривать с двух точек зрения – как их использовать (на клиентской стороне), и как их создавать (на серверной стороне). &lt;/P&gt;
&lt;P&gt;Для того, чтобы использовать такое свойство, вам не нужно учитывать практически ничего – для клиента оно выглядит как обычное CLR-свойство. То есть, пока вам в ваших классах не нужна функциональность, предоставляемая подсистемой Dependency Properties, вам не нужно знать об этом совсем ничего. &lt;/P&gt;
&lt;P&gt;Для того, чтобы создать Dependency Property в своем коде, нужно знать и уметь определенные вещи. Использование Dependency Properties накладывает на дизайн вашего кода некоторые ограничения. Во-первых, класс, который содержит Dependency Property, должен быть наследником класса DependencyObject. Во-вторых, такие свойства создаются по определенному несложному шаблону. Идея этого шаблона состоит в том, чтобы сначала зарегистрировать описание вашего свойства, используя определенные статические методы классов среды, а затем предоставить доступ клиентам к этому свойству при помощи фасада из обычного CLR-свойства. Чтобы не путать вас таким описанием, приведу простой пример кода. &lt;/P&gt;&lt;IMG src="http://img239.imageshack.us/img239/8592/dppatternzs2.png"&gt; 
&lt;P&gt;Видно, что на статическом уровне мы сначала регистрируем описание свойства, а затем предоставляем фасад для него при помощи обычного синтаксиса. Все довольно просто. Конечно, при разработке могут потребоваться и более сложный синтаксис регистрации, но в подавляющем большинстве случаев это выглядит так, как показано выше. &lt;/P&gt;
&lt;P&gt;Таким образом, мы получаем видимое извне "обычное" свойство, а также тот факт, что описание этого свойства зарегистрировано во внутренних механизмах WPF и эта регистрационная информация может быть использована для поддержки описанной выше функциональности. &lt;/P&gt;
&lt;P&gt;В заключение хочется подчеркнуть следующее. Далеко не все свойства в WPF – Dependency Properties. Этот механизм используется только там, где это нужно. Таким образом, для прикладного программиста должно стать естественным правило использовать Dependency Properties только при необходимости. &lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=73" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /></entry><entry><title>Архитектура WPF. Расширения XAML</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_1004400445043804420435043A044204430440043004_-WPF.-_20043004410448043804400435043D0438044F04_-XAML.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_1004400445043804420435043A044204430440043004_-WPF.-_20043004410448043804400435043D0438044F04_-XAML.aspx</id><published>2006-10-18T15:16:00Z</published><updated>2006-10-18T15:16:00Z</updated><content type="html">&lt;P&gt;&lt;B&gt;Описание значений свойств при помощи XAML-элементов&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;Значение свойства какого-либо объекта, описанного при помощи XAML, можно просто описать при помощи атрибутов XML, например: &lt;/P&gt;&lt;IMG src="http://img239.imageshack.us/img239/1369/attr.png"&gt; 
&lt;P&gt;Когда это требуется (например, если значение свойства является коллекцией элементов или содержит вложенные объекты, которые также подлежат описанию), программист может использовать другой синтаксис на базе XML-элементов. Например: &lt;/P&gt;&lt;IMG src="http://img239.imageshack.us/img239/537/elem.png"&gt; 
&lt;P&gt;Здесь используются выражения типа “РодительскийЭлемент.ИмяСвойства”. Воспринимаются такие выражения довольно просто и натурально. &lt;/P&gt;
&lt;P&gt;Похожий синтаксис используется для задания свойств, зависящих от родителя (аналог функциональности IExtenderProvider Windows Forms). Такие свойства называются Attached Properties и это тема для отдельного рассказа. &lt;/P&gt;
&lt;P&gt;&lt;B&gt;Расширения разметки XAML&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;Язык декларативной разметки XAML спроектирован как надмножество XML и предусматривает набор специфических для него расширений. В основном эти расширения заключаются в специальном синтаксисе, который формируется при помощи фигурных скобок {}. Такие расширения называются расширения разметки (Markup Extensions). Их использование выглядит следующим образом: &lt;/P&gt;&lt;IMG src="http://img239.imageshack.us/img239/868/simple_ext.png"&gt; 
&lt;P&gt;Здесь для значения свойства Style используется особый синтаксис, который указывает на необходимость получения значения из указанного ресурса. В XML-пространстве имен, которое обычно используется в WPF по умолчанию (http://schemas.microsoft.com/winfx/2006/xaml/presentation) имеется несколько типов таких расширений (например, StaticResource, DynamicResource, Binding, RelativeSource, TemplateBinding). Также в XML-пространстве имен, которое обычно объявляется под псевдонимом x (http://schemas.microsoft.com/winfx/2006/xaml) находятся несколько типов таких расширений (x:Type, x:Static, x:Null, x:Key). Используются они, естественно, точно также как и вышеупомянутые. &lt;/P&gt;&lt;IMG src="http://img239.imageshack.us/img239/3925/ext.png"&gt; 
&lt;P&gt;Заметим, что в последнем примере используется «вложенный» синтаксис для расширений; с точки зрения XAML это допустимо. &lt;/P&gt;
&lt;P&gt;Программист может определить также свои расширения, реализовав соответствующий класс, порожденный от MarkupExtension. &lt;/P&gt;
&lt;P&gt;Интересно ознакомится со справочником по доступным стандартным расширениям разметки XAML, который входит в состав документации по WPF. Таким образом можно узнать о многих интересных возможностях, например, встраивание в XAML процедурного кода при помощи x:Code. &lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=72" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /></entry><entry><title>Близкий взгляд на WPF. Часть 1. Знакомство с XAML</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_11043B04380437043A0438043904_-_3204370433043B044F043404_-_3D043004_-WPF.-_27043004410442044C04_-1.-_17043D0430043A043E043C044104420432043E04_-_4104_-XAML.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_11043B04380437043A0438043904_-_3204370433043B044F043404_-_3D043004_-WPF.-_27043004410442044C04_-1.-_17043D0430043A043E043C044104420432043E04_-_4104_-XAML.aspx</id><published>2006-10-18T15:09:00Z</published><updated>2006-10-18T15:09:00Z</updated><content type="html">&lt;P&gt;Использование XAML(читается «замл») является основным способом декларативного программирования в среде WPF. Вот небольшой пример кода XAML, который используется для определения окна с текстом и кнопкой, визуально «прилепленными» к друг другу. &lt;/P&gt;&lt;IMG src="http://img231.imageshack.us/img231/5185/xamlprimitivelw5.png"&gt; &lt;IMG src="http://img231.imageshack.us/img231/1543/primitiveresultqg8.png"&gt; 
&lt;P&gt;На рисунке показаны основные элементы этого простого примера. Весь документ занимает тэг Window, который декларативно определяет окно, его свойства и содержимое. &lt;B&gt;Атрибут (1)&lt;/B&gt; задает имя так называемого Code-behind класса, то есть класса, который будет содержать процедурную программную логику для данной разметки. Понятие Code-behind классов позаимствовано из ASP.NET, где оно имеет практически ту же семантику и широко используется. Code-behind класс для данной разметки мы рассмотрим здесь чуть позже. &lt;/P&gt;
&lt;P&gt;&lt;B&gt;Атрибуты (2)&lt;/B&gt; содержат описания того, какие XML-пространства имен используются в данном документе. Те два пространства имен, которые мы видим на рисунке, используются в WPF практически всегда; их использование учтено в шаблонах для создания соответствующих элементов проектов Visual Studio. Первое пространство имен содержит описание стандартных элементов WPF и используется по-умолчанию, второе – описание специальных расширений XAML и по соглашению имеет псевдоним x. Также XAML предлагает специальный синтаксис для подключения пространств имен .NET; это выглядит следующим образом: &lt;/P&gt;&lt;IMG src="http://img231.imageshack.us/img231/1843/customnsgo5.png"&gt; 
&lt;P&gt;Как видно, для того, чтобы подключить CLR-пространство имен к вашему документу, необходимо назначить ему псевдоним, указать собственно его имя и имя сборки. Насколько я знаю, для того чтобы это работало, ссылка на эту сборку должна быть добавлена в проект. Для того чтобы добавить ссылку на пространство имен из текущей сборки, нужно просто опустить часть «;assembly=XXX». &lt;/P&gt;
&lt;P&gt;&lt;B&gt;Атрибуты (3)&lt;/B&gt; содержат описание некоторых свойств окна; здесь это заголовок, ширина и высота. Здесь все довольно просто. &lt;/P&gt;
&lt;P&gt;Далее находятся тэги, которые описывают содержимое окна. Непосредственным логическим «ребенком» окна является &lt;B&gt;панель типа StackPanel (4)&lt;/B&gt;, которая используется для обеспечения последовательного горизонтального (как в данном случае) или вертикального размещения дочерних элементов. &lt;/P&gt;
&lt;P&gt;В эту панель вложены два стандартных элемента управления: &lt;B&gt;текстовый блок (5)&lt;/B&gt; и &lt;B&gt;кнопка (6)&lt;/B&gt;. Описание кнопки задает ее имя (которое будет доступно как имя члена класса типа Button из Code-behind класса) и подразумевает наличие &lt;B&gt;обработчика события Click (7)&lt;/B&gt; также в этом процедурно описанном классе. &lt;/P&gt;
&lt;P&gt;Прежде чем мы перейдем к рассмотрению code-behind класса, хочу сказать, что мне очень нравится возможность задавать имена только для тех элементов, для которых они нужны (как в случае с кнопкой). Известно, что в Windows Forms ситуация сложилась по другому – даже для самого незначительных сплиттера и панели нужно задавать имена и чаще всего они имеют вид вроде splitter1; затем, как показывает практика, разработчики привыкают к этому и начинают давать такие «безымянные» имена даже значимым элементам. Здесь же легко применить всегда полезный принцип – если надо что-то назвать – подумай и назови хорошо, а если не надо – то и не беспокойся. &lt;/P&gt;&lt;IMG src="http://img231.imageshack.us/img231/9674/primitivecodeyw2.png"&gt; 
&lt;P&gt;На рисунке выше показан вид code-behind класса для описанной разметки. Выглядит очень похоже на описание такого же класса для Windows Forms – все очень просто. Впрочем, так и должно быть. &lt;/P&gt;
&lt;P&gt;Кстати, у нас есть возможность выразить то, что мы сделали при помощи XAML, на C#. Если посмотреть на такой код (он будет похож на сериализованный код дизайнера Windows Forms), то он будет в полтора-два раза объемнее чем XAML, а элегантность и лаконичность не стоит даже и сравнивать. &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=71" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /></entry><entry><title>Введение в WPF, часть 2</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_120432043504340435043D0438043504_-_3204_-WPF_2C00_-_47043004410442044C04_-2.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_120432043504340435043D0438043504_-_3204_-WPF_2C00_-_47043004410442044C04_-2.aspx</id><published>2006-10-18T15:08:00Z</published><updated>2006-10-18T15:08:00Z</updated><content type="html">&lt;P&gt;&lt;B&gt;Что нового? Основные факты.&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;Векторный принцип воспроизведения изображения на экране. Доступно также воспроизведение трехмерных сцен и отображение растров. Для формирования изображенния на экране используется так называемый graphics retained mode. То есть изображение на экране формируется не при помощи процедурной раскраски пикселов в методах типа OnPaint, а при помощи обработки движком среды данных о векторных и трехмерных примитивах в памяти. Такой подход очень похож на тот, который используется в программировании интерактивной трехмерной графики: прикладной программист задает систему вложенных графических объектов в памяти декларативным или процедурным способом, а графический конвейер производит растеризацию, то есть отображает то, что видно через камеру на экране. Следует учесть, что растеризация производится при помощи Direct3D, то есть с использованием доступных в системе средств аппаратного графического ускорения. Так как все элементы управления созданы методом композиции векторных графических примитивов, то становятся легко реализуемыми интересные эффекты масштабирования и свободных векторных трансформаций отдельных элементов управления, различных группирующих панелей и целых рабочих пространств. &lt;/P&gt;
&lt;P&gt;Приложения на базе WPF делятся для две целевые группы – традиционные настольные и Web-based. Web-based отличаются от первых более низкими доступными привилегиями безопасности во время выполнения, отсутствием необходимости инсталляции приложения, и специальным странично-ориентированным (похожим на Web) механизмом навигации. Web-based приложения напоминают апплеты Java, но с отсутсвием заявлений со стороны Microsoft о их переносимости. Для запуска браузер-ориентированных приложений на целевой машине необходимо присутствие .NET Framework 3.0 &lt;/P&gt;
&lt;P&gt;Активное использование декларативных методов программирования. Разметка осуществляется при помощи использования формата XAML (Extensible Application Markup Language), спецификация которого является расширением спецификации XML. Использование XAML обусловлено несколькими причинами. Во-первых, есть смысл описывать при помощи XAML те вещи, для которых это является логичным и выгодным (например, разметка элементов управления, описание векторного и трехмерного графического материала, элементы data binding, и так далее). Выгоды от применения XAML в контексте средств разработки я опишу отдельным пунктом. После приобретения некоторого опыта работы со средой, способ мышления перестраивается на более «декларативный». Похожие вещи я наблюдал, когда начал активно применять шаблоны языка С++. Для создания WPF – приложения не обязательно использовать XAML. XAML является лишь верхним вспомогательным слоем управляемого API WPF. То есть к любой функциональности среды можно получить доступ процедурным способом. &lt;/P&gt;
&lt;P&gt;XAML дает большие возможности для разработчиков инструментальных средств. Из-за наличия жесткой открытой спецификации формата XAML, сторонние разработчики могут создавать конкурирующие инструментальные средства (GUI Designers, Graphics Designers и т.д.). Уже сейчас на рынке имеются несколько таких коммерческих продуктов. Официальными инструментальными средствами для обработки XAML от Microsoft являются продукт под кодовым названием Orcas, который предоставляет функциональность GUI Designer в форме расширения для Visual Studio 2005 и системы под названием Expression Interactive Designer, которая является GUI Designer и Graphic Designer одновременно. Первый продукт предназначен для программистов, а второй в большей степени для графических дизайнеров соответственно. Примечательно то, что Expression Interactive Designer создан по технологии WPF и является функционирующим примером довольно большого приложения. &lt;/P&gt;
&lt;P&gt;WPF предлагает разработчикам новую модель создания элементов управления. В отличие от «замкнутых в себе» элементов управления MFC и Windows Forms c прошитым внутри кодом пиксельной отрисовки, WPF предлагает элементы управления, созданные по принципам открытости и расширяемости. К любому стандартному элементу управления WPF можно применить стили и шаблоны. Стили являются некоторым аналогом CSS: они позволяют декларативно, централизованно, основываясь на типе целевого элемента, с учетом наследования, устанавливать значения различных свойств визуальных элементов. Шаблоны позволяют в значительной степени изменить стандартный внешний вид и поведение визуальных элементов декларативными способами. &lt;/P&gt;
&lt;P&gt;Стандартная библиотека элементов управления содержит достаточный набор средств для организации GUI, но все же заметно, что Microsoft как обычно оставляет большую нишу на рынке для сторонних разработчиков библиотек элементов управления. Я думаю, что из-за вступления в силу новой архитектурной парадигмы для разработчиков элементов управления рынок сторонних библиотек для WPF будет качественно отличаться от подобных рынков для Windows Forms и MFC. Скорее всего, в эточ бизнесе большую роль приобретут графические дизайнеры. &lt;/P&gt;
&lt;P&gt;Использование XAML, инструментальных средств, Retained mode graphics и механизмов расширения элементов управления дает возможность более структурировано организовать процесс разработки presentation layer приложений. Таким образом, дизайнер может «нарисовать» общий вид приложения при помощи XAML, а программист затем занимается несложной адаптацией такого макета к работающему приложению. Этим поток работ над оригинально выглядяшими приложениями WPF схож с деятельностью по разработке традиционных веб-сайтов (но с отсутсвием механических проблем с нарезкой, версткой и поддержкой переносимости). &lt;/P&gt;
&lt;P&gt;Разработчики ввели в состав WPF достаточно обширную функциональность поддержки отображения и обработки различных документов. Теперь не нужно использовать ActiveX компонент веб-браузера или стандартный RichTextBox для отображения сложного отформатированного документа с разными встроенными объектами. Для этого в WPF существуют входящие в стандартную поставку элементы управления. В этом контексте Microsoft предлагает для использования новый универсальный основанный на XML формат XPS (XML Paper Specification). Кроме жестко специфицированного общего открытого формата документов (в замену достаточно ущербному на мой взгляд двоичному RTF и тяжеловесному PDF), спецификация XPS предоставляет возможности автоматической архивации и передачи таких документов, и продвинутую систему печати твердых копий, которая будет доступна в Windows Vista. Насколько я знаю, приложения из пакета Office 2007 могут экспортировать свои данные в формат XPS. &lt;/P&gt;
&lt;P&gt;Существует так же встроенная поддержка анимации (изменения в зависимости от разных факторов) практически любых свойств визуальных объектов. Такая анимация может быть задана в XAML декларативно. &lt;/P&gt;
&lt;P&gt;Хорошо поддерживаются встраиваемые в документы XAML (потоковые) видео и аудио данные. &lt;/P&gt;
&lt;P&gt;Выше я перечислил краткий список основных, «видимых извне» новаторских возможностей WPF. В следующем постинге я попытаюсь рассказать больше о возможностях для программистов и высокоуровневой архитектуре среды. &lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=70" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /></entry><entry><title>Введение в WPF, часть 1</title><link rel="alternate" type="text/html" href="http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_120432043504340435043D0438043504_-_3204_-WPF_2C00_-_47043004410442044C04_-1.aspx" /><id>http://dev.net.ua/blogs/e-zolotko/archive/2006/10/18/_120432043504340435043D0438043504_-_3204_-WPF_2C00_-_47043004410442044C04_-1.aspx</id><published>2006-10-18T15:04:00Z</published><updated>2006-10-18T15:04:00Z</updated><content type="html">&lt;P&gt;Здравствуйте, меня зовут Женя Золотько и занимаюсь разработкой клиентских GUI-приложений и библиотек элементов управления последние несколько лет. Я успел поработать с несколькими разными средами создания GUI (включая не основанные на .NET). Сейчас близится выпуск .NET Framework 3.0, который включает в себя предложение Microsoft для разработчиков GUI - Windows Presentation Foundation (WPF, кодовое название Avalon). Я начал понемногу, обзороно и точечно изучать эту среду, и у меня возникло желание публиковать небольшие русскоязычные материалы по этой теме. Сейчас вы читаете первую такую публикацию. &lt;/P&gt;
&lt;P&gt;&lt;B&gt;Специфика разработки GUI-приложений.&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;Спустя некоторое время после того как разработчики начали создавать GUI-приложения в промышленных масштабах, некоторые из них стали задумываться о том, какие проблемы возникают и какие методы работы могут помочь в решении этих проблем. Оказалось, что проблем в этой области довольно много. Самой очевидной является то, что GUI-код на заре развития этой отрасли выглядел просто ужасно. Можно конечно возразить, что тогда были ковбойские времена и любой код выглядел ужасно. Но все же этот код был очень запутанным и чаще всего сами его создатели не могли в нем после разобраться. Далее, каждая компания-разработчик выдвигала свои требования к GUI-приложениям и добавляла свои "изюминки" к способу его реализации. Таким образом, для того, чтобы создавать морально допустимыми способами удовлетворительный UI, многие компании и разработчики создавали вспомогательные библиотеки практически с нуля. Позже выяснилось, что лушие способы создания GUI имеют похожие черты. Во-первых, чем лучше будет управление бизнес-логикой будет отделено от обработки ввода-вывода, тем лучше. Во-вторых, чем чаще код GUI повторно используется, тем лучше. И в третьих, чем проще задавать общий внешний вид для GUI тем тоже, естественно, лучше. И вот, исходя из этих и еще нескольких соображений, крупные и небольшие поставщики программного обеспечения (а конкретно библиотек и инструментов разработки) уже успели спроектировать, реализовать, научить людей пользоваться и продать довольно много разных решений, которые, по идее должны воплощать решение извечных проблем разработки GUI. Так уж выходит, что создать хорошее GUI-приложение без поддержки библиотек и сред разработки сейчас врядли получится. &lt;/P&gt;
&lt;P&gt;&lt;B&gt;Технологии-предшественники WPF, WinAPI и чистота концепций&lt;/B&gt; &lt;/P&gt;
&lt;P&gt;Первая среда, с которой я столкнулся для разработки GUI была библиотка Turbo Vision, которая входила в состав пакета Borland Turbo Pascal. Эта среда позволяла создавать приложения, работающие под управлением MS-DOS в текстовом режиме работы экрана. Естественно, получающийся пользовательский интерфейс был не совсем графическим, но все равно довольно впечатляющим. Это была объектно-ориентированная библиотека на базе языка Turbo Pascal, которая к тому времени (почти два десятилетия назад) содержала почти все необходимые архитетурные элементы для современных промышленных решений. Она вводила понятия элементов управления, команд, событий или сообщений, и так далее. Расположение элементов управления надо было указывать процедурно вручную в координатах текстового экрана. Тогда она мне казалась верхом футуризма. Позже, когда Windows начала набирать обороты, появилась такая вещь, как WinAPI. При помощи нее Microsoft указывала способ, как писать программы (в том числе и GUI) для Windows. Все мы знаем о Common Controls, ресурсах, GDI и всех этих прекрасных инновациях Microsoft. Но еще, большей части здравомыслящих специалистов известно, что WinAPI - это своеобразное небольшое ИТ-средневековье. Почему-то все более или менее чистые концепции наработанные в "античные" времена DOS, сжигались на костре User32. Не очень-то много людей пострадало от "Ада DLL". Больше нормальных людей пострадало от ада венгерской нотации, моды на непонятные названия и непродуманные дизайнерские решения. Потом появилась MFC, со схожим по духу с WinAPI "объектно-ориентированным подходом", и компонентно-ориентированные продукты Borland, которые пытались построить более или менее концептуально чистые решения на базе неизбежного WinAPI. Еще все знают о до сих пор конвульсирующих элементах ActiveX, которые базируются на построенном на болоте здании COM. Потом появились идеи об управляемых средах, и они были реализованы в виде Java и .NET. Когда я узнал, что Microsoft делает свою управляемую платформу для Windows, я подумал, что они откажутся от WinAPI при создании стандартных библиотек. Но они почему-то создали GUI-библиотеку, очень похожую на библиотеки Borland Delphi/Bulder, только для управляемой среды - Windows Forms. Фактически, все то же, только в профиль. И только почти пять лет спустя Microsoft выпускает библиотеку, которая действительно тщательно спроектирована с нуля, содержит массу технологических инноваций и предлагает конечным пользователям GUI, основанный на новом векторно-трехмерном движке. Таким образом, некоторые из нас могут заинтересоваться этой действительно необычной ситуацией сейчас, и, возможно, получить от этого доход. &lt;/P&gt;
&lt;P&gt;Более детально об основных инновациях WPF я расскажу здесь в следующем посте. &lt;/P&gt;&lt;img src="http://dev.net.ua/aggbug.aspx?PostID=69" width="1" height="1"&gt;</content><author><name>EugeneZ</name><uri>http://dev.net.ua/members/EugeneZ.aspx</uri></author><category term="WPF" scheme="http://dev.net.ua/blogs/e-zolotko/archive/tags/WPF/default.aspx" /></entry></feed>