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-фид «ночных сборок»: https://www.myget.org/F/perspex-nightly/api/v2/Packages

Комментарии (14)


  1. northicewind
    22.09.2015 13:31

    Очень интересно, спасибо. Особенно круто, что планируется поддержка мобильных платформ. А есть какой-то getting started для Mac OS X?


    1. kekekeks
      22.09.2015 13:32
      +2

      Ставите пакет из NuGet-а и пытаетесь пользоваться. Поддержки intellisense и дизайнера для Xamarin Studio пока нет.


    1. kekekeks
      22.09.2015 13:32
      +2

      github.com/Perspex/Perspex/tree/master/samples/TestApplication — кроссплатформенный пример кода без XAML.


      1. northicewind
        22.09.2015 13:43

        Да, спасибо. Я его и скачал. И про intellisense понял :) Буду смотреть и следить за проектом. Удачи.


      1. Nagg
        22.09.2015 15:45

        Эм… а что за языковые конструкции типа этой: github.com/Perspex/Perspex/blob/master/samples/TestApplication/GalleryStyle.cs#L115?
        ЗЫ: проект интересный, подожду когда запилите под мобилки :-)


        1. kekekeks
          22.09.2015 15:51
          +1

          Indexer initializer + перегрузка операторов "!" и "~". "!" для биндинга, "~" для биндинга с приоритетом TemplatedParent. Подробнее тут. Надо вообще заняться перетаскиванием этого дела из бложика grokys в вики.


          1. lam0x86
            23.09.2015 23:34

            А как быть с конвертерами при такой записи? И есть ли в планах задача по переходу от XAML на что-то более читаемое? Эдакий Razor для WPF? Ну, или хотя бы поддержка простейших операций типа сложения и тернарного оператора в биндингах? Это, по-моему, один из главных косяков WPF-а. (У меня пока не было времени детально ознакомиться с проектом. Если что-то уже реализовано, замечательно!)


            1. kekekeks
              24.09.2015 00:13
              +2

              И есть ли в планах задача по переходу от XAML на что-то более читаемое? Эдакий Razor для WPF?
              Не в этом году точно, нам бы основной функционал доделать. Так-то фреймворк проектировался с прицелом на поддержку нескольких языков разметки, на OmniXaml зависимость только в одной либе есть.
              Ну, или хотя бы поддержка простейших операций типа сложения и тернарного оператора в биндингах
              Буквально сегодня дискутировали на тему того, как внедрить в разметку выражения не превратить при этом её в спагетти.


  1. VioletGiraffe
    22.09.2015 15:31

    Только .NET? C C++ не подружится?


    1. kekekeks
      22.09.2015 15:40

      Для С++ вроде Qt с его QML вполне неплохо работает. А инфраструктуры для биндингов в стиле WPF у плюсов малость не хватает.


      1. VioletGiraffe
        22.09.2015 15:44
        +1

        QML — гадость (лично на мой взгляд). К Qt cо временем всё больше и больше претензий копится. Начиная с того, что как-то только хочешь сделать что-то не совсем стандартное — это либо очень проблематично, либо невозможно, и заканчивая тем, что серьёзный баг за 10 месяцев так и не починили, из-за чего я до сих пор не могу перейти с древнего Qt 4 на современный Qt 5.


  1. sdvn
    29.09.2015 10:44

    Интересный проект, а .NET CF не тянет? Что-то я нигде не увидел упоминания.


    1. kekekeks
      29.09.2015 11:33
      +1

      Сборка производится в PCL с Profile7. Из коробки это на CF не завести. При большом желании можно попробовать скомпилировать, доложив исходники недостающих классов из Mono. Бэкэнд оконной подсистемы использует только win32, так что там замена всего на cordll в DllImport может помочь. Остаётся открытым вопрос о движке отрисовки — Direct2D и Cairo на WinCE не доступны, нужно писать отдельный.


      1. sdvn
        29.09.2015 11:38

        Понятно. Спасибо.