Я работал с Cocoa / Obj-C на протяжении многих лет. Начиная с 2010 года я нахожу это довольно ограниченным по сравнению с WPF / NET Framework. Я перечислю некоторые из найденных различий, и вы сможете судить сами.
Язык разметки
Когда я проектирую в WPF, я получаю очень простую разметку XML, которую я могу легко редактировать вручную или редактировать с помощью инструментов, которые я пишу сам. В Какао я должен использовать XIB-файлы, которые не предназначены для удобного ручного редактирования или манипулирования. Вот простой пример разметки WPF:
<DockPanel>
<Label>Select your favorite food:</Label>
<ComboBox
SelectedText="{Binding FavoriteFood}"
SelectedItemsSource="{Binding AllFoods}" />
</DockPanel>
Это полная разметка, эквивалентная примерно 50 строкам, которые трудно редактировать .xib.
Возможность видеть и редактировать простой XAML невероятно ценна для:
- Прямое ручное редактирование
- Связь с коллегами (например, StackOverflow)
- Контроль источника
- Поиск
- Автоматизированные преобразования
Возможности макета
В WPF я могу использовать панели для автоматического размещения элементов управления при изменении размера окна. Я могу использовать стили для определения расстояния между элементами управления или настраивать поля для получения нужного мне вида, или и того, и другого. В любом случае мой пользовательский интерфейс автоматически адаптируется к изменениям размеров шрифта, размера окна и разрешения экрана. В Какао все элементы управления находятся в определенных точках x и y, как в WinForms, и единственное, что я могу сделать, - это автоматическое изменение размера. Это крайне ограничивает. Например:
- Элементы управления не могут переноситься на новую строку или столбец, поскольку окно становится меньше (WrapPanel)
- Элементы управления не могут добавлять / удалять детали в зависимости от доступного пространства
- Элементы управления не могут перемещаться, чтобы освободить место для элемента управления, в котором больше текста, чем первоначально ожидалось
- Элементы управления не могут выборочно уменьшаться или увеличиваться для заполнения доступного пространства
- Интерфейсный конструктор изначально устанавливает элементы управления в соответствии с рекомендациями по интерфейсу, но применение нового стиля не может изменить макет.
Преимущество макета WPF заключается в том, что вы можете выразить свое намерение через способ добавления элементов управления на панели, а затем настроить точный макет позже. Обратите внимание, что WPF также может работать по старинке, но как только вы используете панели для макета, вы никогда не вернетесь к макету X / Y.
Например, в одном приложении, которое я сделал, были строки со звездными рейтингами и полями для комментариев. Обычно строка была только высотой звездного рейтинга, но когда в текстовое поле вводились длинные комментарии, TextBox становился выше, что делало строку выше, поэтому следующие строки сдвигались вниз. С WPF я получил это поведение бесплатно - с Какао мне пришлось бы кодировать его вручную.
Передача данных
С Cocoa / Obj-C вы в значительной степени ограничены встроенным подключением к данным, которое включает в себя базовый доступ к базе данных и сериализацию в и из файлов. С WPF / NET Framework вы можете напрямую привязать свой пользовательский интерфейс практически ко всему на свете, включая:
- Реляционные базы данных (SQL, Oracle и т. Д.)
- Объектные базы данных (объективность, Versant и т. Д.)
- Устаревшие базы данных (Access, dBase, R: Base и т. Д.)
- Базы данных COBOL на мэйнфреймах
- Собственные форматы баз данных (сотни)
- Веб-страницы
- Веб-сервисы (SOAP, REST и т. Д.)
- XML-файлы
- Плоские файлы (через запятую, через табуляцию, фиксированная ширина)
- Офисные документы (Word, Excel и т. Д.)
- документы OpenOffice
- Поля формы PDF
- Данные GPS-приемника (текущее местоположение)
- Положения физических переключателей, кнопок, рычагов, ручек, ползунков и т. Д.
- Время (локальное или сетевое)
- Счетчики производительности (загрузка ЦП и т. Д.)
- Камеры (видеокамеры, веб-камеры, фотокамеры и т. Д.)
- Аналоговые электронные входы
- MIDI (клавиатуры музыкальных инструментов, звукосниматели и т. Д.)
- OBD-II (мониторинг автомобиля)
- LDAP и Active Directory (информация об учетной записи пользователя)
- WBEM и SNMP (состояние и конфигурация сетевого устройства)
Фактически, вы можете привязать практически ко всему, что драйвер был написан на любом языке NET Framework - и существует более сотни языков NET Framework.
Повторный код
В Какао ваша модель состоит из файла .h и .m, ваш контроллер состоит из файла .h и .m, а ваше представление состоит из файла .xib. Каждое отдельное поле в каждом объекте вашей модели должно ссылаться на каждое из этих мест!
В WPF / NET одно поле обычно появляется только в двух строках кода: один раз, когда модель определена, и один раз, когда она представлена представлением. Например, в моем коде я обычно определяю простые поля модели в XML:
<Property Name="City" Type="string" />
Затем, чтобы создать текстовое поле для редактирования города, я просто перетаскиваю свойство «Город» в свой вид и получаю этот XAML:
<TextBox Text="{Binding City}" />
Таким образом, "Город" упоминается только в двух строках кода во всем моем приложении (если у меня нет другого текстового поля "Город" в другом месте). В Какао "Город" будет ссылаться как минимум пять раз.
Привязка непосредственно к модели
В Какао один контроллер действительно подходит только для одного вида: если вы создаете новый вид для той же модели, вам нужен новый контроллер. В WPF / NET есть лучший способ сделать это, хотя вы все равно можете создавать контроллеры, если вы действительно хотите.
В WPF / NET представление обычно привязывает большинство своих элементов управления непосредственно к модели (см. Пример моего города выше). Другие элементы управления будут связаны с «моделью представления», которая моделирует информацию о состоянии, связанную с текущим представлением. Например, если вы выполняете поиск, «Модель представления» будет содержать строку поиска, чтобы она могла использоваться представлением как для фильтрации результатов, так и для выделения текста поиска.
В WPF / NET вы также можете привязать несколько свойств элемента управления к одной и той же или различным частям вашей модели (или модели представления):
<TextBox Text="{Binding AmountToTransfer}"
Background="{edf:Binding UserIsHappy ? Green : White}" />
Разница в том, что в WPF модель представления обычно разделяется между несколькими экранами, которые похожи по своему поведению, поэтому в приложении LOB при создании настраиваемого представления все, что вам нужно сделать, это отредактировать один файл.
Архитектура команд
В Какао кнопка сохраняет свою цель и действие в NSActionCell
в представлении, что означает, что она вызовет определенный метод для определенного объекта (обычно контроллера). В WPF / NET кнопка имеет событие Click, которое работает таким же образом, но также имеет свойство Command, которое позволяет вам вызывать команду.
Команды в WPF очень мощные, поскольку одна команда может быть общей для всего приложения. Например, сам WPF определяет команду удаления. Пока ваша модель реагирует на эту команду, добавить кнопку «Удалить» в ваше представление так же просто, как выбрать команду «Удалить» в окне свойств, которая создает этот XAML:
<Button Command="Delete" />
Это все, что вам нужно сделать, чтобы получить функциональную кнопку удаления, которая удаляет объект из списка. Обратите внимание также на встроенную команду удаления:
- Имеет привязку клавиш к клавише Delete на клавиатуре
- Предоставляет текст, соответствующий языку («Удалить» или «Eliminar» или «Löschen» или «Supprimer» или ...)
- Включает описательную подсказку
Команда направляется на объекты и модели-предки, поэтому в типичном приложении вам почти никогда не требуется указывать, какой объект получает команду.
Таблицы стилей
В Какао нет механизма для применения таблиц стилей к панелям, чтобы они влияли на все элементы управления на панели, как во время разработки, так и во время выполнения. Например, приложение может захотеть:
- Сделать все текстовые поля в данной области доступными только для чтения
- Сделать все метки жирными
- Дайте всем комбинированным спискам светло-зеленый фон
- Добавить равномерное расстояние между наборами кнопок
- Используйте большую зеленую галочку для набора флажков
- Добавить кнопку Удалить во все списки
- Сделайте так, чтобы все кнопки «Удалить» отображались в виде красного «матового» X вместо обычной кнопки
- Выполните одинаковые настройки для нескольких отдельных элементов
WPF / NET делает все эти операции тривиальными благодаря использованию стилей. Вы можете установить любое свойство любого объекта через стиль. Стили могут быть установлены неявно по типу объекта или явно, например:
<Button Style="{StaticResource DeleteButtonStyle}" />
Таблицы стилей могут быть определены где угодно: в библиотеках элементов управления, на уровне приложения, специфично для «темы», в окне, в директиве ресурсов конкретного элемента управления или непосредственно в элементе управления.
Шаблоны управления
В Какао вы не можете многое сделать для изменения визуального стиля элементов управления, кроме как для того, чтобы подклассировать их, поскольку каждый из них рисует свой собственный внешний вид. В WPF / NET внешний вид элемента управления представлен его шаблоном, который можно свободно заменить практически любым, что вы только можете придумать.
Например:
- Вы можете использовать ListBox в раскрывающихся меню и оформить его так, чтобы он выглядел как обычные пункты меню (с флажком рядом с выбранным в данный момент элементом)
- Вы можете изменить TreeView, чтобы он отображался в виде последовательности списков вместо дерева
- Вы можете изменить «большой палец» ползунка, чтобы он отображался как деловой символ или мультипликационный персонаж в зависимости от вашей целевой аудитории (сдвиньте лампочку или Микки Мауса назад и вперед)
- Вы можете изменить ползунок, чтобы он отображался как ручка или следовал нелинейному пути
- Вы можете изменить CheckBox, чтобы он отображался как кнопка щелчка / выключения, значок замка, который открывается и закрывается, или дверь, которая открывается и закрывается
Шаблоны управления и шаблоны данных могут также включать встроенные анимации, так что, например, ваша дверь может фактически оживлять распахивание при открытии и закрытии, когда вы нажимаете на нее. Это легко сделать в Expression Blend: для этого требуется около 20 щелчков мыши. Просто создайте две линейные анимации и прикрепите их к триггерам событий.
Пользовательские элементы управления
Какао и WPF позволяют создавать подклассы существующих элементов управления для создания новых. В Какао новые элементы управления сериализуются в файл .xib / .nib. В WPF они являются частью XAML, как и встроенные элементы управления:
<StackPanel>
<TextBlock>
Hello, <Run Text="{Binding FirstName}" />.
<Bold>Good morning!</Bold> How are you today?
</TextBlock>
<my:JoySelector Happiness="{Binding Happiness}" />
</StackPanel>
В этом примере JoySelector будет элементом управления, который я определил, а Счастье будет одним из его свойств.
Большая разница между Cocoa и WPF заключается в рисовании пользовательских элементов управления. В Какао вы должны кодировать вызовы для рисования примитивов для создания внешнего вида вашего элемента управления. Несмотря на то, что это опция в WPF, обычно это гораздо проще сделать с помощью шаблона элемента управления.
Например, в Какао вы можете написать:
CGSize size = CGSizeMake(30, 20);
UIGraphicsBeginImageContext(size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 1.0, 1.0, 0.0, 0.0);
CGContextFillEllipseInRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
, тогда как в WPF, использующем XAML, эквивалент будет:
<Ellipse Width="30" Height="20" Fill="Red" />
или в WPF в коде (C #):
return new Ellipse { Width=30, Height=30, Fill=Brushes.Red };
ControlTemplate может, конечно, состоять из нескольких элементов:
<ControlTemplate TargetType="my:JoySelector">
<Grid Width="50" Height="50">
<Ellipse Width="30" Height="20" Fill="Red" VerticalAlignment="Left" />
<Path Data="M0,0 L3,5 L8,8 L5,3 L0,0" Fill="Blue" />
<ComboBox
SelectedItem="{TemplateBinding Happiness}"
Style="{StaticResource JoySelectorBoxStyle}" />
</Grid>
</ControlTemplate>
Этот XAML обычно создается в Expression Blend, щелкая правой кнопкой мыши JoySelector, выбирая «Правка»> «Шаблон»> «Создать новый», рисуя Ellipse, Path и ComboBox, используя инструменты рисования, и выбирая привязку и стиль ComboBox из свойств. окно.
Шаблоны данных
В Какао, если вам нужен список или дерево предметов различных типов, таких как инвентарь оборудования в игре или список различных типов учетных записей (инвестиции, денежный рынок, сбережения), вы в значительной степени должны его кодировать все сами В WPF / NET вы можете использовать DataTemplates.
Например, если каждое оружие имеет «силу удара» и «силу защиты», вы можете включить шаблон данных, подобный этому:
<DataTemplate TargetType="game:Weapon">
<DockPanel TextElement.FontWeight="Bold">
<Image Source="{StaticResource WeaponDrawing}" />
<TextBlock Text="{Binding WeaponName}" DockPanel.Dock="Top" />
<TextBlock Text="{Binding HitStrength}" Foreground="Red" />
<TextBlock Text="{Binidng DefenseStrength}" Foreground="Blue" />
</DockPanel>
</DataTemplate>
Другие игровые объекты будут использовать другие шаблоны, тогда инвентарь можно будет отобразить с помощью ListBox с помощью WrapPanel, чтобы расположить их в порядке чтения. (Обратите внимание, что в WPF ListBox не обязан представлять свои элементы в вертикальном списке: можно использовать любую панель.)
Этот же метод важен в LOB-приложениях. Например, у вас может быть представление по умолчанию для Счета-фактуры, установленное в DataTemplate всего приложения, поэтому любая часть вашего приложения, которая представляет списки Счета-фактур, автоматически отображает их формат по умолчанию. Это может быть значок, номер счета, всплывающая подсказка с дополнительной информацией и контекстное меню, позволяющее открывать и / или редактировать счет.
Триггеры и анимации
В Какао вы можете создавать анимацию, но вы должны написать код как для создания анимации, так и для ее применения. В WPF вы можете определить анимацию, используя временную шкалу в Expression Blend, и установить EventTriggers и PropertyTriggers в представлении, чтобы контролировать, когда она запускается. Чтобы создать анимацию, которая встряхивает кнопку, просто щелкните правой кнопкой мыши, чтобы создать временную шкалу, установите положение кнопки, вращение или масштаб, используя мышь в нескольких точках на временной шкале, и измените автоматически созданный EventTrigger на нужное вам событие. вызвать кнопку.
Какао не имеет хранилища свойств анимации или механизма приведения, поэтому любые изменения, сделанные анимацией, являются постоянными: вы не можете удалить анимацию и вернуть значения свойств обратно. Кроме того, вы не можете анимировать свойства общих ресурсов (например, цвета кисти), не копируя их вручную, и вы не можете анимировать значения, выходящие за пределы допустимого диапазона, и заставить сам элемент управления привести к соответствующему значению. В WPF система анимации имеет возможность отдельно отслеживать значения анимации, связанные значения, значения по умолчанию и принудительные значения, чтобы вы не столкнулись с этими проблемами.
В WPF вы можете настроить анимацию для запуска на событиях пользовательского интерфейса, таких как нажатия кнопок, изменения состояния свойств (включая изменения данных в модели), события, генерируемые моделью, для непрерывного запуска или с помощью кода.
В WPF вы можете создавать собственные классы анимации и использовать их с Expression Blend, как если бы они были частью WPF. Вы также можете рисовать объекты Geometry, используемые встроенной PathAnimation, вместо того, чтобы кодировать их самостоятельно.
Обратите внимание, что WPF имеет возможность создавать и запускать анимации в коде, если вы действительно этого хотите. Также обратите внимание, что встраивание анимации из отдельного приложения, такого как Quartz Composer, - это не то же самое, что анимация свойств объектов пользовательского интерфейса. И Какао, и WPF могут встраивать анимации, созданные с помощью других технологий, но с WPF вы можете использовать Expression Blend для создания временной шкалы, которая анимирует любую часть вашего пользовательского интерфейса.
Преобразования как часть привязки
Какао имеет возможность делать преобразования в и из одного значения, используя NSFormatter. Все более сложное должно быть сделано в контроллере. В WPF вы можете использовать StringFormat для простых случаев встроенного покрытия NSFormatters Cocoa, но вы также можете указать IValueConverter или IMultiValueConverter для реализации пользовательского преобразования значений. Например, вы можете добавить пользовательский конвертер в ряд данных гистограммы, чтобы элементы данных в гистограмме быстро анимировали свои целевые значения в быстрой последовательности (известной как анимация «желе»). Конвертеры WPF могут использоваться как односторонние, так и двусторонние, и могут преобразовывать одно или несколько значений.
Преобразования также позволяют привязывать к нескольким свойствам или вычислениям и форматировать результат, например:
<TextBlock Text="{edf:Binding (Height + Width)/2, StringFormat=0.000}" />
Этот вид связывания с преобразованием невозможен в Какао.
Сторонние контроли
В Какао вы можете включать в свое приложение только виджеты, разработанные для Какао. В WPF вы можете включить элементы управления WPF, но вы также можете включить разделы вашего пользовательского интерфейса, разработанные с использованием WinForms, MFC, HTML, Java, Flash и других технологий. WPF предоставляет средства для интеграции этих других технологий непосредственно в WPF, даже в случае использования своей системы разметки для создания объектов и установки их свойств, например:
<StackPanel>
<TextBlock>Here is a WinForms control:</TextBlock>
<WindowsFormsHost>
<tools:LegacyChartingControl
Width="20" Height="30"
Title="Graph of something"
SeriesXMin="0"
SeriesXMax="10" ... />
</WindowsFormsHost>
</StackPanel>
Носитель, созданный извне
Как какао, так и WPF могут содержать такие мультимедиа, как видео, анимации и растровые изображения, созданные в сторонних инструментах. Каждая среда поддерживает все такие типы носителей, поддерживаемые базовой операционной системой. WPF предоставляет немного больше, чем Cocoa, в плане управления мультимедиа. Например, если вы установите для кнопки команду «MediaCommands.NextTrack» или «MediaCommands.FastForward», мультимедиа будет автоматически реагировать соответствующим образом. Кроме того, WPF обеспечивает некоторые улучшения в асинхронной загрузке мультимедиа.
WPF (через Silverlight) также поддерживает несколько высококачественных видео- и аудиокодеков полностью кросс-платформенным образом, так что вы можете положиться на свои медиафайлы, работающие на любой платформе.
Существуют также инструменты, которые позволяют преобразовывать рисунки, созданные в таких инструментах, как Illustrator, или анимации, созданные в таких инструментах, как Flash, в собственные рисунки и анимации WPF, что позволяет вам манипулировать и связывать данные с их свойствами. Например, вы можете взять анимацию прыгающего шара, созданную во Flash, и привязать данные к ее координате Y в апогее, чтобы шар отскакивал выше или ниже в зависимости от значения данных в вашей модели.
Сборка мусора
Начиная с 2007 года сборка мусора наконец поддерживается в Cocoa / Obj-C, но многие библиотеки по-прежнему не могут ее обработать, поэтому большая часть кода Cocoa, написанного сегодня, все еще использует ручное распределение памяти с подсчетом ссылок. Таким образом, даже сегодня вы все еще много "[abc release]" разбросаны по всему коду Какао! WPF / NET с самого первого дня собирал мусор, поэтому у него нет этой проблемы.
Выполнение в веб-браузере
Приложения какао в настоящее время ограничены выполнением в качестве настольных приложений, тогда как WPF может запускаться в веб-браузере так же легко, как и на рабочем столе, с использованием технологии XBAP или Silverlight.
Кроссплатформенность
История здесь похожа:
Приложения Какао изначально запускаются в Mac OS X, а также могут работать в Windows и Linux с помощью Cocotron или GNUstep и ограничивая себя набором функций.
Приложения WPF изначально запускаются в Windows, а также могут работать в Mac OS X и Linux, используя Silverlight и ограничивая себя набором функций.
Единственное существенное отличие состоит в том, что Silverlight может работать в браузере и имеет гораздо лучшую поддержку и инструменты от поставщиков, чем Cocotron или GNUstep.
Другие расширенные возможности WPF
До сих пор я не нашел никаких возможностей в Какао, которых нет также в WPF / NET, но я нашел много в WPF / NET, которых нет в Какао, например:
- Все элементы управления, такие как кнопки, текстовые поля, комбинированные списки и т. Д., Могут работать так же хорошо в 3D-сценах, как и в 2D-макетах. Они также могут быть произвольно растянуты, повернуты, перекошены и т. Д.
- Расширенные возможности рисования, такие как PolyBeziers, комбинированные геометрии, RenderTransform против LayoutTransform, контроль альфа-прозрачности и т. Д.
- Расширенные кисти, такие как градиентные кисти, мозаичные кисти и «Визуальные кисти», которые позволяют создавать произвольно сложные кисти для рисования, например, вы можете рисовать отражение своего окна, включая все его элементы управления.
- Подсистема анимации позволяет анимировать практически каждое свойство, например, я анимировал свойство TextBox «Текст», чтобы оно показывало, что текст набирается в
Сторонние алгоритмы и драйверы
Какао / Obj-C может вызывать предварительно скомпилированные библиотеки, которые используют соглашения о вызовах C и вызывают методы вызова для объектов, определенных в некоторых других языках. Это означает, что API в стиле C обычно требуется для стороннего кода, который необходимо интегрировать в ваше приложение. WPF / NET может включать код, написанный на более чем 100 языках, прямо в ваше приложение и позволяет вам получить доступ ко всем функциям напрямую. Кроме того, он также может вызывать предварительно скомпилированный код, написанный на других языках с использованием C, C ++, COM, DCOM, веб-служб и других соглашений о вызовах. Кроме того, существуют открытые прокладки с открытым исходным кодом, позволяющие коду NET Framework напрямую обращаться к множеству других языков и систем. Это означает, что приложения WPF почти никогда не должны включать более небольшого количества клея для подключения к стороннему коду, включая драйверы устройств.
Сравнение языков
Сравнение Objective-C с C # является важной задачей, и я не буду пытаться ее выполнить. Достаточно сказать, что начиная с версии 4.0, C # содержит все функции Objective-C и многое, многое, многое другое. Я изучал Objective-C в 1989 году - задолго до того, как C # даже был задуман - и в то время это был удивительно мощный язык. Теперь, когда я использую его, я съеживаюсь, особенно из-за потери LINQ и Generics.
Попробуйте преобразовать данные в Objective-C:
DataContext =
from lesson in AllLessons
where lesson.Active
groupby lesson.Category into category
select new
{
categoryName = category.Key.Name,
lessonsInCategory =
from lesson in category
select new
{
lesson,
fullName = lesson.ShortName + " " + lesson.Suffix,
priority = rand.Next(10)
}
};
Если AllLessons предоставляется динамически, вы можете напрямую связать этот результат в WPF (с <ListBox ItemsSource="{Binding}" />
) и динамически обновлять его в реальном времени.
При использовании LINQ с C # вы также можете выполнять объединения, сортировку и т. Д. Бэкэнд-код вообще не пишется, а IntelliSense в Visual Studio помогает заполнять имена свойств и т. Д. При редактировании и даже подчеркивает ошибки.
Я не знаю ни одного хорошего сравнения между Objective-C и C #, но есть хорошее сравнение между C # и Java в википедии, которое вызывает многие функции C #, которые также отсутствуют в Objective-C.
Языковые привязки
Какао не ограничивается Objective-C, а WPF не ограничивается C #. Оба доступны с ряда других языков. Разница в том, что какао построено на Objective-C, поэтому использование его на другом языке может стать довольно неловким. Например, действия становятся вызовом метода Objective-C, который имеет совершенно другую семантику, чем Java или другие языки. С другой стороны, WPF был специально разработан, чтобы не требовать каких-либо специальных функций C #, чтобы его можно было легко использовать с других языков. Например, при использовании с Java (в котором отсутствуют истинные свойства), PropertyDescriptor вместо этого использует методы get и set.
Кроме того, поскольку приложение построено на платформе NET Framework, приложение WPF может одновременно работать с объектами и библиотеками, закодированными на нескольких языках. Это означает, что если вы найдете отличную реализацию алгоритма на C ++, Haskell или Ruby, вы можете просто использовать код, не переписывая его на свой язык. В Какао обычно нужно переписать код как Objective-C или создать код-шим для вызова другого языка.
Общие преимущества
Вот несколько преимуществ Какао по сравнению с конкурентами, которыми он делится с WPF:
- Богатая функциональность типографики
- Возможность включения 3D-графики
- Встроенный редактор для редактирования текста, включая проверку орфографии
- Undo / повтор
- Добавление функциональности к существующим классам (категории в Obj-C, вложенные свойства и стили в WPF)
- Простое удаленное взаимодействие с вызовами методов
Заключительные замечания
При сравнении Cocoa с WPF следует сравнивать Interface Builder с Expression Blend, а не с Visual Studio. Visual Studio отлично подходит для написания кода, но, на мой взгляд, Expression Blend - это only инструмент для разработки пользовательского интерфейса.
Для практического развития приложения основное различие между WPF и Какао обычно , а не - более мощные графические возможности WPF, поскольку они могут быть включены в приложение Какао путем их ручного кодирования. Основное отличие заключается в привязке данных и переходе от модели-представления-контроллера к модели-представления-представления-модели, что делает WPF намного более эффективным для разработки приложений.
Возможно, я пропустил недавнее улучшение Какао в вышеприведенном описании, так как в последнее время я мало использовал Какао. Если я каким-либо образом был несправедлив по отношению к Какао (или к WPF), пожалуйста, добавьте комментарий и дайте мне знать, что я пропустил.