Alexey's profileLife vs. ProgrammingPhotosBlogListsMore ![]() | Help |
|
June 05 ОстановкаУважаемые (судя по статистике кто-то тут еще остался), данный блог больше поддерживаться не будет. Совсем. Даже в режиме зеркала.
Приглашаю всех по адресу http://alexey.raga.name
Спасибо за внимание :) May 31 Команда, просто команда.Давно ничего не писал - другие мысли в голове, но в за последние дни уже несколько раз сталкивался с различными странными способами решения одной и той же "проблемы". "Проблема" эта состоит в следующем: необходимо динамически добавлять пользовательские элементы управления на форму. Естественно, эти элементы должны как-то реагировать на то, что делает с ними пользователь. Задача стара как мир, но каких только способов решения ее не увидишь... Сегодня, например, я даже столкнулся с таким совершенно экзотическим способом: разработчик наследовался от кнопки для того, чтобы определить ее поведение. То есть у него были такие наследники, как, скажем, SettingsButton, DeleteButton и т.д. Экземпляры этих кнопок создавались и передавались контролу, который их внутри себя размещал. Сначала я не знал, смеяться мне или плакать, но потом решил, что, поскольку создавшего это я не знаю, то все же посмеюсь. Заодно и напишу о том, как эту задачу правильно решать. Ничего нового я не скажу и те, кто при слове "Команда" уже все поняли, дальше могут не читать. Итак, нам нужно разделить, а точнее, не допустить смешения public abstract class CommandBase Допустим, у нас есть контрол, в который динамически должны добавляться кнопки, нажимая на которые пользователь будет вызывать наши функции. private void RegisterButton(CommandBase command) А потом просто использовать этот метод там, где мы "наполняем" пользовательский интерфейс: MyProfileCommand profileCmd = new MyProfileCommand(currentUser);Navigator.RegisterButton(profileCmd); MainMenu.RegisterMenu(profileCmd); Создание пользовательского элемента на основании команды можно вынести в фабрику, в сервис или придумать что-то еще. Важно то, что мы не делаем в нашем коде микс из логики и элементов управления и то, что мы всегда можем использовать одну и ту же команду несколько раз, вызывая ее из разных элементов пользовательского интерфейса или из недр нашего приложения, поведение легко контроллируется, код легко поддерживается. Здесь я привел наверное самый примитивный вариант использования этого простого подхода. Немного расширив его можно получить очень неплохой результат, но, прошу вас, не прибегайте в ваших приложениях ко всяческим экзотическим подходам в виде наследования кнопок, хранилища делегатов или писанине всей логики приложения в функциях типа button1_Click(..) :) May 26 Новый ноутбук: выбор сделан.
Дело в том, что после того, как у меня потрескались корпуса у КПК Acer N30 и ноутбука Acer 5021, связываться с Acer'ом больше не хотелось. Связываться с AMD Turion после того, как жарким бельгийским летом он просто вырубал комп без предупреждения тоже не хотелось. В конце концов выбор пал на Dell Inspiron 9400 со следующими параметрами: CPU: Core2 Duo 2.00GHz Все драйверы ко всем устройствам уже были установлены с дистрибутивом Висты и работают прекрасно. Из полезного софта было установлено Windows Vista Home Premium, Roxio DVD Studio, Dell MediaDirect. Весь софт, который был нужен, установился и работает без проблем: Nikon Capture NX, Ulead VideoStudio 11, Abby Lingvo 12 и т.д. В общем, покупкой я доволен. Вот еще, меня спрашивают, насколько это удобно - такое разрешение на 17-дюймовой матрице. На мой взгляд - очень даже удобно. По своим характеристикам (чекткость, яркость) эта матрица превосходит матрицы ноутов HP и Acer'а, которые у нас есть. И, хотя на том же Acer'е матрица очень даже неплохая, разница ощутима, когда ставишь ноуты рядом. Что же касается работы.. Час назад установил на ноут Visual Studio "Orcas" Beta1. Просто супер - я могу открыть все нужные мне панели и при этом остается еще полно места для написания кода. Очень здорово. Остается только поблагодарить Dell за их работу: заказ делали по телефону, просили изменить конфигурацию (матрица, процессор, память и т.д) а так же, самое главное, англоязычный софт и QWERTY-клавиатуру (местные используют AZERTY). За все это с меня содрали 1564 евро, цена для ноута такой конфигурации очень даже ничего. Счастливого ему "плавания" ;) May 20 Smart Client Software Factory - May ReleaseБуду краток. Майский релиз SCSF. Поддержка WPF, CAB, улучшенный гайдлайн и т.д. Брать можно здесь: http://www.codeplex.com/smartclient
May 07 Электронные платежи: российская действительность.Я вот решил проапгрейдить Лингво до 12-й версии. А еще есть такой магазин - СофтКей. Поэтому пошел в этот СофтКей, сказал ему, что хочу Лингво, а платить буду карточкой Visa. К сожалению, ключа внутри не оказалось, равно как и ссылки, откуда можно скачать купленное. Полез читать про оплату. Вроде все должно быть ОК.
Ужас какой. Вообще-то я с ними разговаривать не хотел. Я ввел свой номер карты, я ввел CCV. Я хотел продукт, а говорить по телефону, да еще и в международном роуминге не хотел совершенно. И как быть, если я немой?! Что, немым, получается, никак нельзя купить продукт? Выходит, что быстро оплатив картой продукт я теперь должен ждать, когда проснутся менеджеры и поимеют удовольствие общения со мной... Вот такая она, российская действительность. У кого только тут покупал - не видел такого... May 06 День рождения Королевы Беатрикс
День рождения Королевы отмечается в Нидерландах 30-го апреля не смотря на то, что родилась королева Беатрикс где-то в середине лета. Объясняется это тем, что день рождения предыдущей королевы, матери нынешней, был именно 30-го апреля. В этот же день она отреклась от престола и ее место заняла Беатрикс. Вот так, королевы меняются, а праздник решили не переносить. Какая разница, на самом деле, что праздновать - коронацию или день рождения? Да и вообще, совместить можно. В этот день по всем крупным городам Нидерландов с утра устраиваются народные гуляния, ярмарки и распродажи. Любой человек может выйти на улицу и что-нибудь продать, при этом он не обязан платить налогов. Магазины тоже могут торговать в "безналоговом" режиме, правда, практически все они в праздник закрыты. Но на тех немногих, что все же работают, можно обнаружить объявления: "Сегодня в течение всего дня скидка 25%". Мы приехали в Амстердам утром, часов около 11, и город был уже полон. Нам сразу же выдали какие-то (оранжевые) рюкзачки, кстати, идея очень полезная - кто-то складывал туда мусор, кто-то - приобретенные на ярмарке вещи.. Народ стекался в столицу до самого вечера - по улице от вокзала в центр шел сплошной (оранжевый) поток в течение всего дня. Каналы в старом Асмтердаме были запружены лодками, лодочками, суденышками, практически в каждом из которых играла музыка, (оранжевые) люди устраивали пикники, а на некоторых, размерами побольше, устраивались целые дискотеки. Их было так много, что периодически даже возникали пробки на воде. Кстати, обратил внимание на ряд местных развлечений, интересующиеся могут перенять.
На музейной площади весь день и вечер шел концерт. Но народу было так много, что протиснуться туда мы даже не стали пытаться. В общем, гуляния прошли хорошо, весело. В очередной раз порадовало то, что все вокруг было мирно, никаких тебе "бычков-братков" с заплывшими от пива глазами (я все никак привыкнуть не могу к этому факту).
Ночь и половину следующего дня до отъезда мы провели в Гааге - в городе, где находится королевский дворец и где живет сама виновница торжества - Королева Беатрикс. Гуляний там уже не было, а 1-е мая нидерландцы не празднуют, так что время выдалось спокойным для того, чтобы прогуляться до дворца, побродить по берегу моря и подивиться странной нидерландской скульптуре (видимо, у них свой Церетели есть). May 04 Первомайские выходные: Франция.На прошлые выходные выпало покататься по близлежащим странам. Соответственно, два дня мы катались по Франции, поставив себе целью посетить столько замков, сколько успеем (успели три) и оставшиеся два дня провели в Нидерландах, празднуя день рождения королевы Беатрикс и гуляя по Гааге. Для начала расскажу поездке во французские замках, коих мы, как я уже сказал, посетили три: Фонтенбло, Блуа и Амбуаз. Замки эти оказались настолько разными, что я даже подумал, что вот бы объединить достоинства трех в одном. Фонтенбло, огромный старый замок времен Филипа Первого, удивил заброшенностью и пустынностью своей территории. Но при этом его "содержимое" оказалось просто сплошным произведением искусства. Несколько снимков: Блуа - замок, который известен двумя вещами. Амбуаз тоже отличился в истории. Здесь была поставлена точка в первой войне между гугенотами и католиками - заключен амбуазский мир. Здесь же прятался король Франсиск Второй во времена заговора гугенотов, которым надоело преследование. Гугеноты хотели избавиться от фанатичных Гизов и, если удастся, убрать Франсиска Второго от власти и передать эту самую власть Бурбонам. Но замок там крепкий, высокий, так что нападение было отбито, а головы нападающих украсили ворота и стены замка... Кроме замков в те дни мы успели погулять по Орлеану (Жанну д'Арк помните?) и поразмышлять о тех скудных клочках огромной и, как теперь начинаем понимать, очень интересной истории, которые остались в наших головах.. Лично я пришел к выводу, что вся путанница в истории тех веков - из-за Генрихов. Уж очень много их было и в Англии и во Франции, и королей и герцогов :) Вооот.. А потом мы поехали в Нидерланды, праздновать день рождения королевы Беатрикс. April 25 ЛюксембургНужно будет вернуться. Интересный город в плане выйти-погулять. К тому же я так и не узнал доподлинно, как же звучит люксембургский язык :) Несколько фотографий здесь: http://picasaweb.google.be/alexey.raga/Luxembourg April 20 Identification19626561.d1fa5f484d857eb8134c36667de3fad7.1177098222.79bd302d9b18628104b38b515dbba682 April 18 Keukenhof - тюльпановый райВ прошлые выходные съездили в Keukenhof, это городок в Нидерландах, в 45 километрах от Амстердама. Голландия очень известна своими тюльпанами и вообще номер один по цветам, а в окрестностях этого городка очень много тюльпановых полей. Кроме того там находится чудеснейший цветочный парк, по которому мы и "отгуляли" 6 часов подряд. Фоторезультаты этого гуляния можно пронаблюдать здесь: http://picasaweb.google.be/alexey.raga/Keukenhof Собственно, больше ничего писать не буду, фото говорят сами за себя. April 16 О "Начальниках Камчатки" или в продолжение разговора...
Михаил Смирнов затеял разговор на тему руководителей проектов, которую я хотел бы подхватить. Руководитель проекта - это не "начальник программистов". И часто ПиЭмы сводят на нет всю идею собственной позиции, воспринимая себя как человеков, созданных для того, чтобы давать таски и спрашивать "как продвигается". На самом деле ситуация становится гораздо продуктивнее, когда все три "ветви власти" работают в штатном режиме, каждый в своей зоне ответственности:
То, насколько именно тестировщиком (и всей командой) понята концепция этой самой "реальной работы" - вот одна из задач ПиЭма. Еще раз скажу: ПиЭм - это не "начальник камчатки". Для начальствования, ежли таковое требуется, есть тимлиды в каждом из звеньев (у программеров - свой, у тестеров - свой). Эти тимлиды и распределяют и перераспределяют, если нужно, ресурсы их тимов для того, чтобы идти по графику, не ПиЭм. Всякие там методологии - они как закон. Они - одно для всех, и для ПиЭмов, и для КьюЭйев, и для разработчиков. "Начальник камчатки", рулящий "а сейчас левая нога делает шаг впереееед... тааак, правая пока на месте, а щас пошлаааааа, пошлааааа" не нужен вовсе. Единожды утвержденный на "слете представителей всех трех партий" процесс под названием "как мы будем обустраивать проект" (на самом деле таких слетов потребуется не один, а много в процессе работы) дает ответы на все методологические вопросы. На таких "сходняках" (особенно в начале проекта) на базе требований формируется регламент, который будет выдерживаться благодаря всеобщей заинтересованности в этом. То есть, вместо идеологически неверного "сделал - отчитался ПиЭму, он напряжет кого-то другого" все три "отрасли" находятся во взаимодействии, стараются идти по определенному ими же общему плану в рамках принятого цикла. Словом, я хочу лишь сказать (в том числе и как человек, работающий, словами Михаила, в большой компании, ориентированной на IT), что часто встречающаяся практика восприятия ПиЭмов (в том числе и ими самими) в качестве непрозрачного прокси между клиентом и разработчиками (слушаю первого, пинаю вторых) - порочна.
делать неправильно ;) К сожалению, это очень часто встречается... April 14 Редактирование видео: Выбор сделан.С тех пор, как мы купили цифровую видеокамеру (Canon HV10) встал вопрос о том, какой софт использовать для обработки отснятого. Некоторое время я "ковырялся" в бесплатном софте типа VirtualDub, MediaCoder и т.д, но понял, что это не для меня. Ни один из встреченных мною бесплатных продуктов не умел делать работу полностью - от захвата видеоизображения и до получения результата. Так, например, VDub умеет делать захват, кое-какой процессинг, но в нем совершенно невозможно делать даже самый простенький (многого мне не нужно) монтаж... Кроме того, мне не удалось заставить его, например, кодировать результат с помощью кодеков из Windows Media SDK 11. MediaEncoder мне понравился, он понимает все нужные мне форматы, но только и умеет, что перекодировать из одного формата в другой.. Выбор осложнялся тем, что у меня HDV-камера, а подавляющее количество софта не понимает или таких разрешений, или формата .m2t, который отдает камера.. Поэтому для того, чтобы просто пихнуть это дело в тот же VDub приходится просто пользоваться дополнительной утилитой перекодирования. Все это жутко нудно и неудобно, поэтому я снова стал смотреть в сторону платного софта (в самом начале эпопеи я перепробовал практически все триалы, какие нашел). Выбирал из трех вариантов бюджетных продуктов:
Первым "отпал" Пинакл по причине своей капризности, нестабильности и требовательности. Ну и интерфейс там странный, но это уже придирки :) В борьбе Юлида и Сони Вегаса победил Юлид. Он продемонстрировал бОльшее количество "фич", кроме того, к нему есть патч, созданный специально для "понимания" моей камеры. После оплаты (благодаря PayPal это заняло пару минут) я получил не только сам VideoStusio Plus но и еще всякие пакеты с бонусами и дополнительными возможностями (типа Cool3D). То есть, вместо 2-х инсталляционных файлов мне предоставили аж 9 оных, приятно :) Пойду сносить триалы, устанавливать все это дело и, наконец, обрабатывать видео с того же Мон-Сан-Мишеля и Парижа :) April 12 DSL & Software Factofies: V3Я уже писал о том, что такое DSL и Software Factories, как выражается второе через первое и т.д. Теперь вы можете увидеть это своими глазами на примере Services Software Factory V3. Отличия в частности в том, что в данном случае мы будем иметь "классический" DSL вместо обычного для фабрик набора указаний "сделай то-то". Лично мне этот вариант кажется более логичным, гибким и удобным. А вообще посмотреть стоит даже не столько ради самой фабрики, сколько ради того, как следует применять DSL. Просматривая ролик, подумайте о том, что если бы в ваших приложениях и фреймворках, которые вы поддерживаете и на базе которых делаете продукт, применялась такая техника - сколько времени вы бы каждый раз экономили? :) April 10 Поездка в Нормандию - Mont Saint MichelКак я уже писал, в прошлые выходные съездили во Францию, в Нормандию, в совершенно замечательное место - Mont Saint Michel. Что это такое лучше всего видно на фотографии: Это монастырь, построенный на острове, на скале высотой около 80 метров. Примечательно то, что монастырь этот был построен потому, что этого настоятельно требовал архангел Михаил. Именно настоятельно, так как ему пришлось при этом трижды сниться епископу Альберту и убеждать его в необходимости сей постройки. Сам же епископ вовсе не горел желанием что-либо строить в такой "дыре" и полагал, что его сны есть не более, чем ночные видения. И тогда Архангелу Михаилу пришлось действовать более радикально: приснившись епископу в очередной раз он нажал пальцем на лоб спящему, да не просто нажал, а сделал там нехилую вмятину размером с монету. Череп епископа с этой самой вмятиной, кстати, хранится в музее и его можно увидеть. Представьте, как это было: практическии полная изоляция, два раза в сутки прилив-отлив, вода прибывает и убывает со скоростью около 20 км/ч, во время отлива море уходит километров на 15-20 от стен монастыря. Самая большая в Европе высота прилива - 9 метров - именно здесь. Значительно позже строится дорога, соединяющая Mont Saint Michel с "большой землей", а до того поломники (а это одно из мест поломничества) добираются (те, которым везет) до цели во время отливов прямо по пескам. Естественно, на фото не поломники (хотя монастырь действующий и там живут полтора десятка монахов), а туристы, которые ходят на такие прогулки во время отливов с проводниками. Без проводников ходить по пескам запрещено, ибо чревато. Интересен и тот факт, что Mont Saint Michel никогда не был захвачен силой, ибо на лодках подойти к нему невозможно по причине отливов, а держать осаду невозможно по причине приливов. Сам монастырь многообразен как в отношении архитектуры, так и в отношении его роли в истории. В общем, поездка очень понравилась. Очень хотелось остаться и посмотреть на гору ночью, но, к сожалению, возможности такой не было... P.S. Напоследок показавшийся забавным факт, рассказанный гидом: в окресностях Mont Saint Michel жители держат много барашков специальной породы - с серыми туловищем, черными ногами и черной головой. Так вот, поскольку эти самые барашки пасутся в такой вот местности, куда постоянно приходит море, мясо их имеет солоноватый вкус, оно мягкое и лишено характерного привкуса баранины. April 09 Релиз Enterprise Library 3.0На самом деле релиз состоялся еще 5-го апреля. Тогда (днем) я хотел написать об этом, но домашняя страница проекта еще не была обновлена и я решил подождать. А на следующий день уехал в Нормандию, о чем будет следующий пост :) Поэтому пишу сейчас. Итак, релиз. Из основных улучшений и новшеств: - Новые Application Blocks: Validation Application Block и Policy Injection Application Block (немного расскажу ниже) Коротко о новых блоках. Valication Application Block позволит разработчику в декларативной форме (с помощью атрибутов или непосредственно в конфигурационном файле) задавать правила валидации свойств объектов. Работает это и в WinForms, и в ASP.NET и в WCF Policy Injection Application Block - позволяет разработчику контроллировать операции, осуществляемые над объектом. Например, можно задать правило, чтобы при вызове метода Hello класса World происходила запись в лог. Или, перед вызовом проверить какие-то условия (разрешен ли доступ, находимся ли в режиме онлайн и т.д), а после завершения вызова совершить какие-то действия (записать аудит, сбросить кеш и т.д.). В общем об инфраструктуре EL3 можно сказать еще и то, что "конфигуратор" теперь интегрирован в Visual Studio 2005. Не скажу, что это такое уж большое и важное изменение, но все же приятно :) Осталось добавить только, что EL3 на 100% совместима с EL2, то есть, разработчикам не придется переделывать код при переходе (во всяком случае такое обещано). А пока буду думать о Нормандии :) March 24 Российская обувь в БельгииСегодня, гуляя по городу, встретили на "развале" коробки с обувью российской марки "Ральф Рингер". На коробках даже надписи сделаны по-русски. Помимо самого факта удивило две вещи: 1) Цена. Пара ботинок стоила 20 евро. Поскольку я носил обувь от "Ральфа" и знаю, что она из себя представляет (и сколько стоит), то могу допустить, что здесь продавались подделки. В этом смысле ситуация становится еще более интересной: тут ведь практически нет подделок (хотя это в магазинах, на развалах, вероятно, полно) и подделывают обычно престижные фирмы типа Экко и т.д... А подделка обуви российского производителя, причем даже с коробками на русском языке выглядит странной :) Впрочем, в прошлом году осенью я был в России и пытался купить себе ботинки этой фирмы.. Но не смог - ассортимент был нехороший, да и качество, как мне показалось, упало. Быть может оно упало еще ниже и это был оригинал? Но цена в 20 евро все равно удивляет. March 14 О кочевникахТолько что посмотрел фильм "Кочевник". Однако это все ерунда. Когда мы заспорили с женой и полезли искать факты в интернете, то оказалось, что то, что я всю жизнь знал под названием "кызыл-орда", оказывается, называется в России "золотая орда" и преподается в российских (по крайней мере в подмосковных) школах под этим названием :) Прикольно. Видимо, "кызыл" - это "золото" по-казахски. Столько лет прошло, а я продолжаю "изучать" казахский язык, по которому у меня тройка в аттестате. Да и то благодаря состраданию учительницы, ибо молчал на экзамене как партизан.... :) WebServices: что может быть проще?В последнее время ничего не пишу - сижу, ковыряюсь с WPF. Нравится очень, гибкость офигительная, но многое нужно постигать как бы сначала... Впрочем, об этом в другой раз, а пока вернусь к веб-сервисам. Писать этот постинг меня сподвигло то, что сразу с двумя человеками из разных компаний и разных городов недавно разговаривал о том, как (и почему именно так) нужно строить архитектуру при работе с веб-сервисами. Итак, начнем есть трехслойный пирог (серверная логика, веб-сервисы, клиентская логика) с середины, то есть, со слоя веб-сервисов. Создавая слой веб-сервисов мы создаем контракт между двумя остальными частями (серверной и клиентской). Сам же слой представляет собой набор доступных операций, этакий API, для слоя клиентской логики и является не более, чем клиентом для слоя логики серверной. Отсюда вытекает простая рекомендация: не нужно передавать клиентскому приложению объекты бизнес-модели серверной логики. С точки зрения развития и поддержки приложения, я бы даже сказал "никогда не нужно". Создавайте отдельные объекты для передачи посредством веб-сервисов. Такие объекты называются "контрактами данных" (Data Contracts). Зачем это нужно? Очень просто. Как я уже сказал, клиентское приложение, пользуясь веб-сервисом Reports, совершенно не заинтересовано "знать" бизнес-модель серверной части. И для него бизнес-сущность "User" вовсе не является набором "запись в таблицу Users + ссылка в таблицу Occupations + ссылка в таблицу Departments + 2 ссылки в таблицу Addresses по их IDшникам". Ему и надо-то воспользоваться сервисом Reports всего лишь для того, чтобы этот самый репорт отобразить, и для него User - это "монолитный" объект со всеми необходимыми адресами, должностями и т.д. А вот информация о паролях, логинах, ролях и т.д. ему совершенно не нужна, поэтому и передавать ее в сервисе Reports не за чем. - Счастливы в том числе и разработчики серверной логики, которые могут модифицировать объекты бизнес-логики, не боясь "сломать" интерфейс между сервером и клиентами. Счастливы, в конце концов, те, кому все это потом поддерживать. Ибо в данном случае слои получаются слабо связанными, легко понимаемыми и легко модифицируемыми (в том числе и независимо друг от друга). Кстати, еще о клиентской части. Первый: Вы получаете для работы "нормальные" бизнес-объекты, наделенные необходимым поведением, необходимыми свойствами, нужными для работы клиентской части приложения и т.д. Это гораздо лучше, легче, да и правильнее с точки зрения ООП, работать с объектами бизнес-модели, нежели с "безликими" наборами данных, которые вы будете пихать по очереди в немереную кучу классов-обработчиков, которые будут как-то манипулировать этими данными. В небольших (по функциональности и времени поддержки) приложениях это еще куда ни шло, но в случае серьезных проектов вы рискуете если не потерять контроль над сложностью системы, то наплодить кучу лишних обходных путей (представьте себе судьбу того, кому в этих "заплатках" потом разбираться), вместо того, чтобы продолжать работать в рамках объектно-ориентированной парадигмы. Второй: Вы сами контролируете объекты, с которыми вы работаете. Итак, коротко обобщим основные рекомендации:
Словом, воспринимайте веб-сервисы, как средство передачи данных, а не объектов бизнес-модели. И будет вам простота разработки, и вы будете избавлены от необходимости поддерживать совершенно немодифицируемый (в силу очень сильной связанности всего и вся) код с разбросанным по разным местам поведением. Пример (упрощенный) веб-метода, возвращающего данные о производителе товара:
Здесь ManufacturerGetById - это класс-action, умеющий вернуть сложный объект бизнес-модели серверной части по его идентификатору. Далее он трансформируется в простой объект контракта данных Brand, который и будет предоставлен клиенту. Клиент же, получив эти данные, таким же способом заполняет ими свой объект February 28 Visual Studio "Orcas" - мартовский CTPЕще не настал март, как уже вышел обещанный CTP новой Visual Studio, о которой я рассказывал здесь. Скачать можно как образ для Virtual PC (сам Virtual PC бесплатен, если кто не помнит), так и "обычный" инсталляционный пакет. Изменений ОЧЕНЬ много, да я уже давал ссылку на видео с некоторыми из них... February 26 CAB + WPF23-го февраля, видимо в качестве праздничного подарка, был выпущен релиз Composite Application Block, который поддерживает WPF. Ура! Пока создатели SmartClient Software Factory грозятся выпустить в конце апреля новую версию их продукта, которая будет содержать инструменты для добавления View, использующих WPF (и еще нескольких новых фич), CAB с поддержкой WPF можно скачать здесь: http://www.codeplex.com/wpfcab Для работы с ним нужно:
Все, проект WPF CAB готов. Дальше все как обычно, кроме того, что вместо WinForms можно использовать WPF для создания View. Кстати, если сейчас запустить приложение, то у него даже не будет окна. Для того, чтобы исправить этот "недостаток", нужно создать новую WPF-форму с именем, скажем, ShellWinfow.xaml и переопределить известный метод в ShellApplication: protected override void AfterShellCreated(){ base.AfterShellCreated(); ShellWindow mainWindow = RootWorkItem.Items.AddNew<ShellWindow>(); Shell.MainWindow = mainWindow; mainWindow.Show(); } Ну и еще одна "фича". В тех элементах, где планируется использование воркспейсов (DeckWorkspace, TabWorkspace, etc), в заголовок можно добавить следующий атрибут: xmlns:cab="http://schemas.microsoft.com/cab/wpf" <cab:DeckWorkspace x:Name="headerWorkspace"/> В остальном работа с CAB не изменилась. Более подробно можно посмотреть в примере (BankShell), который теперь тоже "переведен" на CAB WPF. |
|
|