Perspex — кросплатформенный UI-фреймворк с XAML и биндингами

    TL;DR: кроссплатформенный клон WPF. От других попыток сделать нечто с XAML-ом выгодно отличается наличием полностью своей системы отрисовки со сменными бакэндами (сейчас поддерживается Direct2D и Cairo). В наличии инспектор, дизайнер (см. видео). Биндинги сделаны на стероидах под названием ReactiveExtensions (старый стиль тоже можно использовать). Умеет работать с Windows/Linux/MacOS, поддержку мобильных платформ планируется добавить в начале следующего года посредством отрисовки через MonoGame.



    Текущий статус проекта — вторая альфа. То есть, щупать уже можно, но в продакшн тащить всё же рановато. В наличии солидный набор работающих контролов: Button, ToggleButton, CheckBox, HtmlLabel, RadioButton, Canvas, ContentControl, Control, Controls, Deck, Decorator, DropDown, Image, ItemsControl, ListBox, ListBoxItem, Menu, MenuItem, Panel, StackPanel, Grid, Primitives.Popup, Primitives.SelectingItemsControl, Primitives.TabStrip, Primitives.TemplatedControl, Primitives.Thumb, Primitives.Track, ScrollViewer, TabControl, TabItem, TextBlock, TextBox, ToolTip, TreeView. DockPanel в закрывающееся окно релиза второй альфы не пролез, доступен в ночных сборках. Нативный вид для них будет сделан примерно так же как и в WPF — созданием дефолтных тем для распространённых платформ. Заниматься фигнёй с написанием кусков платформозависимого UI-кода, как необходимо делать в случае с Xamarin.Forms при использовании Perspex не придётся.

    Система типов и API рисования достаточно схожи с WPF, например, мне без особых проблем удалось портировать HtmlLabel из HtmlRenderer.

    Система стилей по сравнению с WPF несколько расширена. У контрола может быть несколько стилей с разными селекторами, например :pointerover, что позволяет делать стилизацию наподобие CSS.

    Intellisense в дизайнере пока позволяет автодополнять имена и свойства встроенных в Perspex сущностей, но текущая система его реализации в дальнейшем позволит как подключение через clr-namespace, так и простейшее дополнение для биндингов. Для чего-то более сложного нужно строить полноценное AST, а это достаточно большой объём работ.

    Попробовать в действии проще всего установив расширение для Visual Studio и создав проект из прилагаемого шаблона.

    Репозиторий на GitHub
    Уютный чатик в Gitter (на английском)
    NuGet-пакет
    NuGet-фид «ночных сборок»: www.myget.org/F/perspex-nightly/api/v2/Packages
    Поделиться публикацией

    Комментарии 17

      0
      Очень интересно, спасибо. Особенно круто, что планируется поддержка мобильных платформ. А есть какой-то getting started для Mac OS X?
        +2
        Ставите пакет из NuGet-а и пытаетесь пользоваться. Поддержки intellisense и дизайнера для Xamarin Studio пока нет.
          +2
          github.com/Perspex/Perspex/tree/master/samples/TestApplication — кроссплатформенный пример кода без XAML.
            0
            Да, спасибо. Я его и скачал. И про intellisense понял :) Буду смотреть и следить за проектом. Удачи.
              0
              Эм… а что за языковые конструкции типа этой: github.com/Perspex/Perspex/blob/master/samples/TestApplication/GalleryStyle.cs#L115?
              ЗЫ: проект интересный, подожду когда запилите под мобилки :-)
                +1
                Indexer initializer + перегрузка операторов "!" и "~". "!" для биндинга, "~" для биндинга с приоритетом TemplatedParent. Подробнее тут. Надо вообще заняться перетаскиванием этого дела из бложика grokys в вики.
                  0
                  А как быть с конвертерами при такой записи? И есть ли в планах задача по переходу от XAML на что-то более читаемое? Эдакий Razor для WPF? Ну, или хотя бы поддержка простейших операций типа сложения и тернарного оператора в биндингах? Это, по-моему, один из главных косяков WPF-а. (У меня пока не было времени детально ознакомиться с проектом. Если что-то уже реализовано, замечательно!)
                    +2
                    И есть ли в планах задача по переходу от XAML на что-то более читаемое? Эдакий Razor для WPF?
                    Не в этом году точно, нам бы основной функционал доделать. Так-то фреймворк проектировался с прицелом на поддержку нескольких языков разметки, на OmniXaml зависимость только в одной либе есть.
                    Ну, или хотя бы поддержка простейших операций типа сложения и тернарного оператора в биндингах
                    Буквально сегодня дискутировали на тему того, как внедрить в разметку выражения не превратить при этом её в спагетти.
                      0
                      Посмотрите на: github.com/kentcb/WPFConverters/blob/master/Doc/expression-converter.md
                      Там можно очень сложные выражения писать в биндинге.
                      У нас в проекте даже реализован JScriptConverter (через Microsoft.JScript.JScriptCodeProvider) — с помощью него в биндинге даже мини-скрипты можно писать.
              0
              Только .NET? C C++ не подружится?
                0
                Для С++ вроде Qt с его QML вполне неплохо работает. А инфраструктуры для биндингов в стиле WPF у плюсов малость не хватает.
                  +1
                  QML — гадость (лично на мой взгляд). К Qt cо временем всё больше и больше претензий копится. Начиная с того, что как-то только хочешь сделать что-то не совсем стандартное — это либо очень проблематично, либо невозможно, и заканчивая тем, что серьёзный баг за 10 месяцев так и не починили, из-за чего я до сих пор не могу перейти с древнего Qt 4 на современный Qt 5.
                0
                Интересный проект, а .NET CF не тянет? Что-то я нигде не увидел упоминания.
                  +1
                  Сборка производится в PCL с Profile7. Из коробки это на CF не завести. При большом желании можно попробовать скомпилировать, доложив исходники недостающих классов из Mono. Бэкэнд оконной подсистемы использует только win32, так что там замена всего на cordll в DllImport может помочь. Остаётся открытым вопрос о движке отрисовки — Direct2D и Cairo на WinCE не доступны, нужно писать отдельный.
                    0
                    Понятно. Спасибо.
                  0
                  Вау! Круто! Особенно круто, что это открытый проект с либеральной лицензией! Я надеялся, я верил и вот оно! )))
                  Успешного вам развития проекта! :)
                  поддержку мобильных платформ планируется добавить в начале следующего года посредством отрисовки через MonoGame.
                  Я, почему-то, наивно полагал, что моногаме на мобилках работает только через замарин и без покупки лицензии не обойтись… Разве не так?
                    +1
                    Мобилки вообще будут работать через Xamarin. На iOS просто больше нечем C# в нативный код собирать, для Android через некоторое время (после релиза 1.0) прикрутим свою сборку APK с загрузкой приложения через libmono, скорее всего докрутим что-то поверх вот этого.

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

                  Самое читаемое