Создание приложения Digg при помощи WPF

Цель последнего урока немного отличается от предыдущих семи. На самом деле мы не будем выполнять код в Silverlight в данном уроке - вместо этого мы используем WPF и .NET 3.5. Мы будем  пользоваться  кодом существующего приложения для запуска в Silverlight и повторно используем его для запуска в качестве приложения Windows.

Silverlight содержит в себе совместимые интерфейсы (API), которые представляют собой подмножество из полной версии .NET Framework. Одной из целей является предоставление разработчикам возможности научиться общей модели программирования и набору инструментов, а также способности многократно использовать опыт, код и содержимое в пределах веб-приложений RIA, богатых приложений Windows и пакете программ Office.

Далее я опишу шаги, совершенные мной  для многократного использования кода существующего приложения Digg Silverlight (который работает в обозревателе), чтобы создать версию Windows-приложения (которое работает за пределами обозревателя).

Шаг 1: Создание нового приложения WPF

Мы начнем с создания нового приложения WPF при помощи VS 2008 и назовем его "DiggDesktopSample":


Это создаст проект в VS с двумя файлами - App.xaml и Window.xaml:


Обратите внимание что структура данного проекта очень похожа на случай с Silverlight, созданный в первом уроке данной серии (который имел два файла - App.xaml и Page.xaml).

Шаг 2: Копирование кода существующего приложения Digg в приложение WPF

Мы скопируем код существующего приложения DiggApplication Silverlight в наш новый проект Windows DiggDesktopSample :


Шаг 3: Кое-что исправим

Мне пришлось сделать два изменения для компиляции кода приложения Digg:

1) Мне понадобилось добавить строку в сетевой код для того, чтобы вручную указать заголовок пользовательского агента ("user-agent"). REST API-приложения возвратит ошибку в случае, если ничего не будет послано в качестве заголовка - по умолчанию; Windows-приложения не посылают его в случае, если вы используете WebClient API  (в то время как веб-приложения посылают). 

2) Мне пришлось изменить элемент управления <HyperlinkButton> в нашем пользовательском элементе на <TextBlock>. Это новый элемент в Silverlight 2, который пока не присутствует в полной версии WPF (в будущем они будут добавлены). Мне не пришлось изменять ничего из кода, который работал с данными элементами управления, а также с сетью, LINQ to XML, и кодом привязки данных.

Как только я сделал все эти изменения, проект был скомпилирован.

Шаг 4: Хостинг приложения Digg в окне рабочего стола

Затем я открыл файл Windows1.xaml в проекте (являющийся окном по умолчанию и загружаемый при запуске приложения). 

Я заменил заголовок окна на "Digg Desktop Version" и увеличил его ширину (Width) и высоту (Height).

Я затем добавил наш элемент управления Page.xaml из нашего предыдущего проекта Digg Silverlight в качестве корневого элемента в окне. Это сделает его видимым и загрузит при запуске окна. Мне не пришлось изменить код класса Page или переименовывать что-либо. Поскольку оно получено из пользовательского элемента управления, оно может содержаться в любом окне WPF либо элементе управления. 


Шаг 5: Запуск приложения

Теперь мы можем запустить наше новое настольное приложение Digg. Вся функциональность осталась такой же, как и в версии Silverlight, полностью сохранив поведение:


Когда выбрана статья из списка, пользовательский элемент управления отображает детальную информацию:


Были совершены некоторые косметические исправления. В основном это было сделано потому, что WPF по умолчанию наследует стандартные стили (шрифты, цвета, полосы прокрутки и т.д.) в зависимости от темы оформления операционной системы, выбранной на данный момент, в то время как Silverlight обладает собственной стандартной темой, которую мы используем для всех операционных систем. Если бы нам понадобилось бы сделать обе версии программы абсолютно идентичными, то мы могли бы более явно указать стили (Styles) и шаблоны элементов управления (Control Template) - в противном случае версия настольного приложения будет адаптирована под тему оформления пользовательской оперционной системы.

Вывод

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

Источник