Silverlight

индекс
62,31

Fake eJay (часть №1)


Пример того как можно реализовать приложение наподобие eJay в Silverlight.

PS: Было бы неплохо, чтобы вы хоть немного поработали с программой из серии eJay. Чтобы понимать, что мы собственно собираемся «эмулировать».


Ссылки


eJay
www.ejay.com/

Silverlight
msdn.microsoft.com/ru-ru/library/bb404300.aspx
ru.wikipedia.org/wiki/Silverlight
silverlight.net/GetStarted/

Введение


Для работы нам понадобятся Visual Studio 2008 SP1 (с установленным Silverlight Toolkit аддоном) и Microsoft Expression Blend SP1. Ну и раз уж мы делаем «красивое» приложение то нам также понадобится Microsoft Expression Design. Правда, понадобиться он нам чуточку позже, а пока в Expression Blend создаем «новый проект» (New project…) (Ctrl + Shift + N)

Указываем нужную нам папку и название проекта «Fake_eJay». В качестве языка «Visual C#». После того как проект создался активируем панель «Project».

Выбираем наш проект и в контекстном меню (которое появляется по нажатию ПКМ) выбираем пункт «редактировать в Visual Studio» (Edit with Visual Studio).

Появится Visual Studio с уже открытым проектом.

Теперь у нас открыты две программы Expression Blend и Visual Studio. В обоих открыт наш проект. В Expression Blend мы будем редактировать дизайн и анимацию, в Visual Studio – код


Мелкая, но гадкая проблема


Microsoft официально заявляет, что Expression Blend и Visual Studio – синхронизированы. Тоесть вы можете, к примеру, создать кнопку в Expression Blend, переключится на Visual Studio и написать код обрабатывающий нажатие добавленной нами кнопки. Будьте осторожны, это не всегда так! Не так все плохо. Microsoft нам не соврали, они всего лишь не сказали ВСЮ правду :)

Всего встречается 2 проблемы синхронизации Visual Studio и Expression Blend. Чтобы лучше их понять поэкспериментируем с нашим проектом. В Expression Blend добавим кнопку. Для этого в панели «объекты и временная шкала» (Objects and Timeline)

выберем объект «LayoutRoot», после чего проверим, обведен ли наш объект желтой рамкой, если нет — то кликнем 2 раза по нему. Желтая рамка означает, что этот элемент является «главным», то есть все новые объекты будут добавляться именно в этот элемент. Теперь на панели инструментов 2 раза кликнем по кнопке «кнопка» (Button) (Простите за тавтологию)

Если вы разбираетесь в XAML, то должны понять что мы всего лишь добавили код в файл разметки

Соответственно у нас изменился файл разметки «Page.xaml». Мы видим над ним маленькую звездочку

Теперь добавим обработчик нажатия кнопки. Для этого в панели «объекты и временная шкала» (Objects and Timeline) выберем нашу кнопку (Либо выберем кнопку мышкой :), после чего на панели «свойства» (Properties) нажмем на «события» (Events).

В появившемся списке событий, в текстбоксе напротив надписи «Click», кликнем два раза или напишем – «Button_Click» и нажмем Enter. Перед нами чудесным образом появится Visual Studio c уже написанным обработчикам события

Если вы разбираетесь с C# то понимаете что сейчас изменился файл «Page.cs» в котором находиться код. Вы можете убедиться в этом по звездочке. Добавим в этот обработчик события строку «MessageBox.Show(«Бла бла бла»);». Теперь ничего не делая, переключимся на Expression Blend и попробуем откомпилировать проект (F5).

Мы получим сообщение об ошибке. Это произошло, потому что мы не сохранили изменения в файле «Page.cs». Вернувшись в Visual Studio и сохранив изменения, после чего перейдя в Expression Blend вы сможете спокойно откомпилировать проект

Вот теперь вы встретились с первой проблемой синхронизации Visual Studio и Expression Blend – она не всегда идет в обоих направлениях. Если Expression Blend сам изменил файл «Page.cs» и открыл Visual Studio, то Visual Studio – ничего делать не стал.

Теперь давайте в Expression Blend добавим вторую кнопку аналогично первой. Только теперь на панели «свойства» (Properties) укажем значение Margin-Top равным 100

Теперь переключимся в Visual Studio и на панели «обозреватель решений» (Solution Explorer).

Откроем файл «Page.cs» изменим строчку «MessageBox.Show(«Бла бла бла»);» на «MessageBox.Show(«ХА ХА ХА»);». Теперь чтобы не допустить первую ошибку сохраним изменения в файле (Ctrl+S). После чего откроем файл «Page.xaml» и изменим цвет фона. Для этого в «коде разметки» (XAML) у элемента с именем (x:Name=…) «LayoutRoot». Изменим значение свойства «Background» на «Black»

Также сохраним изменения в файле (Ctrl+S). И чтобы было удобней откомпилируем проект, тут же, в Visual Studio (F5). Вот теперь вы наверняка заметили отсутствие второй кнопки, которую мы добавили в Expression Blend. Вот вторая проблема синхронизации Visual Studio и Expression Blend – нельзя редактировать один и тот же файл в разных программах предварительно не сохранив его.

А что было бы если бы мы сохранив изменения в файле «Page.xaml» откомпилировали бы проект в Expression Blend? Перейдя в Expression Blend перед нами появился бы диалог, который бы сообщил что файл «Page.xaml» был изменен вне Expression Blend. И предложит «загрузить измененные файлы» или «не загружать изменения».

Согласившись загрузить изменения, мы бы всеравно потеряли вторую кнопку. Отказавшись — мы бы потеряли все изменения, сделанные нами в Visual Studio (цвет фона и измененный текст сообщения в MessageBox)

Ну и что? Спросите вы. Я сразу заметил отсутствие кнопки. К чему такие банальности? Это очень хорошо, что вы сразу заметили отсутствие одной кнопки из двух. Но что будет, когда наш проект разрастется? Сможете ли вы проконтролировать присутствие хотя бы 10 кнопок из 100? И как вы будете контролировать присутствие анимации, которая никак не визуализируется? Что если вам в голову придет гениальная идея и вы захотите срочно её проверить? Так что проблема тривиальна лишь на начальном этапе и для простых проектов. В крупных и масштабных проектах она может доставить очень много неприятностей.

Решение этой проблемы весьма простое. Выработайте у себя привычку, перед тем как перейти к работе с другой программой ВСЕГДА сохранять весь проект (Ctrl+Shift+S). Это сбережет много нервов. Далее я не буду напоминать вам об этом. Надеюсь, что вы это запомните.

Теперь давайте отчистим наш проект от наших экспериментов. Удалим все кнопки в файле «Page.xaml» и обработчик события в «Page.cs». Оставим только черный цвет фона (далее он нам пригодится)

Убедитесь что проект сохранен, и одинаков как в Expression Blend так и в Visual Studio.

udp. продолжение следует :)
–3
15 января 2009, 01:50
3

комментарии (20)

+2
kichik #
А при чем тут ejay? :) (и можно было бы на программу хотя бы ссылочку дать)

По существу: если выкинуть первый абзац и переименовать пост, получится какой-никакой, но пост о проблеме синхронизации Expression Blend и Visual Studio.

По первой проблеме у вас получается так:
1. Сделали измениние page.xaml в Blend (Blend:page.xaml_1, page.xaml.cs_0; VS:page.xaml_0, page.xaml.cs_0)
2. Добавили в Blend событие
2.1. Оно прописалось в page.xaml (Blend:page.xaml_2, page.xaml.cs_0; VS:page.xaml_0, page.xaml.cs_0)
2.2. Открылась VS, изменился код page.xaml.cs (Blend:page.xaml_2, page.xaml.cs_0; VS:page.xaml_0, page.xaml.cs_1)
3. Изменили в VS обработчик события (Blend:page.xaml_2, page.xaml.cs_0; VS:page.xaml_0, page.xaml.cs_2)

4. Переключились в Blend — он выдал ошибку, что не может скомпилировать, так как видит, что в page.xaml прописано событие, а в VS нет.

Это не проблема синхронизации. Вы же ничего не сохраняли! Проблема была бы, если бы Вы сохранили код в VS, а Blend это обновление не увидел бы…

По второй проблеме:
5. Сохранили файл в VS (Blend:page.xaml_2, page.xaml.cs_2; VS:page.xaml_0, page.xaml.cs_2)
6. Убедились, что все компилируется в Blend, автоматически все сохранилось (Blend:page.xaml_2, page.xaml.cs_2; VS:page.xaml_2, page.xaml.cs_2)
7. Изменили файл page.xaml в бленд, добавили кнопку (Blend:page.xaml_3, page.xaml.cs_2; VS:page.xaml_2, page.xaml.cs_2)
8. Переключились в VS, изменили page.xaml.cs (Blend:page.xaml_3, page.xaml.cs_2; VS:page.xaml_2, page.xaml.cs_3)
9. Изменили в VS page.xaml (Blend:page.xaml_3, page.xaml.cs_2; VS:page.xaml_4, page.xaml.cs_3)
10. Сохранили, откомпилировали
11. Перешли в Blend, он увидел, что версия на диске обновилась и предложил ее загрузить. О ужас, в ней нет кнопки!

Опять-таки, это не проблема синхронизации. Как раз напротив, Blend правильно среагировал на сохраненное изменение. Это проблема кривых ручек и необходимости сохранять свои изменения.

По проблеме синхронизации в целом: подозреваю, что если xaml редактировать только в Blend, а код только в VS, и все вовремя сохранять, то проблем будет меньше… ну и контроль версий и т.п. никто, вроде, не отменял ))
0
kichik #
*4. Переключились в Blend — он выдал ошибку, что не может скомпилировать, так как видит, что в page.xaml прописано событие, а в page.xaml.cs его нет.
0
Ai_boy #
«Спокойствие, только спокойствие…» (с) Карлсон
Все будет :) Просто, как вы поняли статья будет поделена на много частей…

«ПРОБЛЕМОЙ называется вопрос, не имеющий однозначного решения или предполагающий множество равнозначных решений. Многозначностью возможных решений проблема отличается от задачи» (с) Wikipedia

Ведь вы согласитесь что данные «проблемы» можно решить несколькими путями. К примеру, тем что советуете вы. И тем, что советую я. Соответственно уже ЭТО делает эти «проблемы» — ПРОБЛЕМАМИ (простите за тавтологию).

Главный вопрос еще в том, ЧТО собственно понимать под синхронизацией. Если просто сохранять файлы и переключаться на другую программу (как я и говорил). То псевдо «синхронизация» действительно есть :)
+1
kichik #
«Синхронизация (от греч. synchronos — одновременный) — процесс приведения к одному значению одного или нескольких параметров разных объектов.» (с) Wikipedia

Без фиксации состояния объекта (сохранения), говорить о синхронизации бессмысленно, иначе это уже получается что-то вроде разделяемой области памяти, с которой работает несколько программ.
0
Ai_boy #
Тогда почему Expression Blend «Без фиксации состояния объекта» изменяет файл «Page.cs» и добавляет обработчик события? :)))
0
kichik #
В данном случае Blend не меняет Page.xaml.cs.

Для добавления события используется Visual Studio — и уже в ней правится файл Page.xaml.cs. Пока Вы его не сохраните, Blend изменений не увидит.

Это разумно, так как, как уже написано ниже, Blend — инструмент для дизайна, VS — для программирования.
0
Ai_boy #
По вашей логике…

-> «Без фиксации состояния объекта (сохранения), говорить о синхронизации бессмысленно...»

-> «В данном случае Blend не меняет Page.xaml.cs» — соответственно не сохраняет Page.xaml.cs

-> Синхронизации как таковой нет

-> Expression Blend без сохранения файла не может изменить данные в другой программе. Но ведь он так и делает!

Вот мы собственно и пришли к тому о чем я писал. Синхронизация в Expression Blend и Visual Studio есть, но работает она не всегда одназначно.
0
kichik #
-> «В данном случае Blend не меняет Page.xaml.cs» — соответственно не сохраняет Page.xaml.cs

Он его не изменяет, это другое! Еще раз: файл открывается для редактирования в Visual Studio, изменяется в VS.

Если в VS измененный файл не сохранить, никакой синхронизации не может быть, так как не было фиксации состояния файла.

Если в VS измененный файл сохраняется — наступает синхронизация, то есть Blend видит, что файл был изменен. Если этот же файл был одновременно открыт в Blend, наступает конфликт версий, о чем Blend успешно сообщает, предлагая сделать выбор. Синхронизация работает, причем работает вполне однозначно.

-> Expression Blend без сохранения файла не может изменить данные в другой программе. Но ведь он так и делает!

О чем это?
0
Ai_boy #
-> «Если этот же файл был одновременно открыт в Blend, наступает конфликт версий, о чем Blend успешно сообщает...»

Тут вы ошибаетесь.

Если после создания обработчика события в Expression Blend мы в VisualStudio сохраним изменения в файле Page.xaml.cs, то Expression Blend НИЧЕГО НЕ СООБЩИТ. И где «конфликт версий»?

PS: Откройте Expression Blend и Visual Studio и проверьте…

PPS: И зачем тогда Microsoft в Visual Studio 2010 собирается улучшить «синхронизацию» с Expression Blend если по вашему все работает? :)
0
kichik #
Так в том-то и дело, что в Blend .cs файлы не открываются (он не предназначен для редактирования кода!). Поэтому сообщать не о чем, Blend отслеживает изменения в открытых в нем xaml-файлах.

Это точно также, как Blend не открывает для редактирования медиа-файлы.

Для отслеживания изменений во всех файлах проекта существуют специальные системы контроля версий. Это не задача Blend.

Если не секрет, а откуда сведения про «собирается улучшить синхронизацию»?
0
Ai_boy #
Ссылку на сайт программы eJay добавил. Просто в свое время данная программа была довольна популярна, поэтому и не стал выкладывать ссылку. Да и сейчас по ней можно найти очень много инфы в том же Google :)
+1
UrbanRider #
Можно, но читатели любят, когда автор позаботился о пользователях, и сам привел ссылки.
0
Ai_boy #
А иногда читатели минусуют за «пиар» программы :)
+1
jeje #
Копец, что за тенденция, рассчитываешь почитать интересный материал, то автор «застолбил место и набирает текст», то «это кусочек, далее будет..».
Вообще о чем статья? Если слово о eJay нету, сдесь описана проблема синхронизации и все. Значит статью так и нужно назвать.
0
Ai_boy #
«Patience is bitter, but its fruit is sweet» (с) Rousseau
0
jeje #
Если кусочек был бы по теме :).
0
Ai_boy #
Ну вы меня тоже поймите. На создание (только) скриншотов к первой части ушло больше часа :)

PS: Обязуюсь во второй статье выложить информацию по теме.
+1
jeje #
Я вас прекрасно понимаю :D
+1
tigra_mgc #
Мне кажется, статья имеет сомнительную ценность. Особенно если учесть, то эти два инструмента для разных людей: разработчика и дизайнера.
Перепрыгивание из одной программы в другую съедает время и отвлекает.
Думаю было бы разумно описать создание основного функционала и дизайна в разных статьях. На мой взгляд, это будет полезно.
0
Ai_boy #
Спасибо за совет. Обязательно подумаю над этим.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.