Мы рады представить третью альфа версию Perspex (см. предыдущий анонс).
Perspex — кроссплатформенный UI-фреймворк для .NET с открытым исходным кодом, сделанный по образу и подобию WPF, с XAML, биндингами, шаблонами контролов, собственной системой отрисовки и прочими плюшками.

В этом релизе добавлена первоначальная поддержка платформ iOS и Android, улучшены дизайнер и XAML, исправлено множество ошибок.



Список изменений под катом.


iOS/Android

При помощи нашего нового бэкенда на C++ на базе Skia стало возможным использование единого кода рисования для всех платформ (за исключением WinRT, но там должен завестись текущий Direct2D-бэкенд), что позволило достаточно быстро портироваться на мобильные платформы. На текущий момент поддержка только на базовом уровне (см. видео), нет многооконности, попапов, на iOS не работает текстовый ввод, да и жесты преобразуются в события мыши, но мы работаем над этим. Использование нативного бэкенда в дальнейшем позволит делать сборки для Android без использования Xamarin за счёт использования libmono и NativeActivity. С iOS всё несколько сложнее, LGPL-лицензия не позволяет использовать Mono-рантайм, так что придётся ждать возможности запуска на iOS coreclr.

XAML

В прошлой версии XAML-биндинги были малость забагованы, в этой версии над ними проведена большая работа, что позволяет весьма уверенно ими пользоваться. Реализована частичная поддержка MultiBinding (пока только в одну сторону), к стандартным биндингам добавлено несколько расширений:

Биндинг к контролам

Вместо
<TextBox Text="{Binding ElementName=other, Path=Text}>"
можно писать
<TextBox Text={Binding #other.Text}>

Асинхронные биндинги

Теперь можно биндиться к свойствам, возвращающим Task или IObservable, система биндингов сама всё обработает как надо.

Инверсия значения

Писали когда-нибудь примитивный конвертер, только чтобы обратить булево значение? У нас теперь можно для этого использовать символ ! в пути биндинга.
<Button IsEnabled="{Binding !IsBusy}">


Шаблоны контролов в XAML

Раньше шаблоны можно было задавать только из кода, теперь даже наша стандартная тема оформления полностью перреведена на XAML.

Мультиселект в листбоксе

Теперь ListBox поддерживает выделение нескольких элементов, причём его можно биндить к модели в обе стороны без колдунств c ItemContainerStyle как в WPF.

Дизайнер

В нашем расширении к Visual Studio реализовано следующее:
  • Увеличение
  • Настройка цвета фона
  • Поддержка автодополнения для attached-свойств и расширений разметки
  • Поддержка clr-namespace, что позволяет получить автодополнение для ваших контролов (только пересобирать не забывайте, метаданные на текущий момент вычитываются только из dll-ок)
  • Поддержка Design.DataContext, Design.Width, Design.Height, так что теперь можно использовать моки моделек и смотреть как это счастье будет выглядеть прямо в дизайнере (пользоваться для этих целей следует расширением разметки Static)


«Прямые» свойства

PerspexProperty, равно как и DependencyProperty в WPF — штука тяжеловесная, так что мы добавили поддержку для превращения обычных свойств в нечто, к чему можно биндиться. Выглядит это примерно так:
public static readonly PerspexProperty<bool> IsFocusedProperty =
    PerspexProperty.RegisterDirect<InputElement, bool>("IsFocused", o => o.IsFocused);
public bool IsFocused
{
    get { return _isFocused; }
    set { SetAndRaise(IsFocusedProperty, ref _isFocused, value); }
}

Что даёт поддержку для данного свойства в реализации INotifyPropertyChanged и GetObservable.




Фреймворк стремительно развивается, но это всё ещё альфа, так что в наличии букет багов всех цветов и расцветок, проблемы с производительностью, которой пока никто толком не занимался, местами может подтекать память, вот это всё. При обнаружении чего-то из вышеперечисленного просьба заводить issue на гитхабе. На текущий момент главными поставщиками багрепортов являются авторы редактора диаграмм Core2D и IDE для встраиваемых систем VitalElement Studio, пытающиеся портировать свои приложения с WPF на Perspex.

Автор Core2D добился некоторого прогресса на этом поприще. Думаю, к концу зимы мы уже выкатим бету, которую можно будет считать чем-то готовым к эксплуатации в небольших приложениях.
С вопросами можно обращаться ко мне и в наш уютный чатик на Gitter (в чатике, невзирая на уютность, только английский).

Репозиторий на GitHub
Чат в Gitter (на английском)
Пакеты в Nuget: Perspex, Perspex.Desktop, Perspex.Android, Perspex.iOS
NuGet-фид «ночных сборок»: https://www.myget.org/F/perspex-nightly/api/v2/Packages

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


  1. IL_Agent
    03.12.2015 14:28

    Очень рад, что XAML живёт и развивается благодаря проектам вроде вашего! Не планируете поддержку web (html5 или может webgl), как замену Сильверлайту?
    Насчёт биндингов. Раз уж вы решили сокращать их запись, может вообще избавиться от слова «Binding»? Это как идея :)


    1. kekekeks
      03.12.2015 14:32

      Не планируете поддержку web (html5 или может webgl), как замену Сильверлайту?
      Ждём WebAssembly и возможности запуска coreclr поверх оного, после чего сделаем бэкенд отрисовки поверх HTML Canvas. По идее не должно сильно отличаться от поддержки iOS, например, ограничения те же самые (отсутствие JIT).
      Насчёт биндингов. Раз уж вы решили сокращать их запись, может вообще избавиться от слова «Binding»?
      Идея хорошая, подумаем над синтаксисом. Можно как в полимере сделать {{My.Property.Path}}.


      1. IL_Agent
        03.12.2015 16:24

        Можно как в полимере сделать {{My.Property.Path}}.

        А почему одинарные скобки нельзя оставить? Потому что конфликтовать с MarkupExtensions будет? А оно поддерживается, кстати?


        1. kekekeks
          03.12.2015 16:26

          Да, будет конфликтовать. Поддерживаемые из коробки расширения разметки здесь.


  1. Bonart
    05.12.2015 16:21

    А как насчет поддержки настраиваемых соглашений а-ля Caliburn Micro?


    1. kekekeks
      05.12.2015 17:41

      Есть мнение, что проще не заморачиваться, а сам калибурн портировать. Он в любом случае будет нужен, без нормального MVVM-фреймворка тяжко.


      1. kekekeks
        05.12.2015 17:47

        Вот, тут персонаж один Prism портирует. Не вижу причин не портировать калибурн.


  1. CRivlaldo
    05.12.2015 20:45

    А что с iOS в данный момент? Используется Xamarin? У coreclr я не вижу iOS в списке доступных платформ.


    1. kekekeks
      05.12.2015 23:24

      Для мобилок сейчас Xamarin. Android в перспективе можем завести без платных библиотек (через ту же libmono самосборную), с iOS кроме Mono работать ничего не умеет, а Mono-овский runtime под лицензией LGPL, что делает нелегальной его статическую линковку без разрешения правообладателя.