Мы живём во время, когда стала актуальной поддержка целого зоопарка платформ и устройств, а .NET Core и .NET Standard существенно упрощают переносимость C#-кода между ними. Однако каждая из платформ предлагает какие-то собственные средства для разработки, причём большая часть из них мысленно застряла где-то во временах MFC и Windows Forms, и не имеет нормальной интеграции с C#. Есть ряд решений, пытающихся привести эти платформы к общему знаменателю и хоть как-то добавить адекватную поддержку MVVM и XAML-вёрстки, но всё это как-то... не то.
.NET-разработчики привыкли к возможности стилизовать контролы где угодно и как угодно, к нормальным привязкам списков к коллекциям, богатой системе биндингов. Именно этого и пытается достичь проект AvaloniaUI, продолжающий идеи WPF в open source. Путь проекта нелёгок и тернист — помимо системы для работы привязок, необходимо самостоятельно обрабатывать весь пользовательский ввод, думать о том, как эффективно отрисовать интерфейс, бороться с разного рода несуразностями со стороны целевых платформ, разбираться с отличиями систем отрисовки (так, из-за неадекватной поддержки ArcTo пришлось адаптировать код, изначально предназначенный для правильной отрисовки орбит комет).
О том, чего уже удалось достичь, что из этого вы уже сейчас можете использовать, а также о трудностях и интересностях при разработке такого проекта — доклад от одного из его участников.
16. 16
В чём проблемы обёрток над нативными
контролами?
● Приведение к платформ общему знаменателю
17. 17
В чём проблемы обёрток над нативными
контролами?
● Приведение к платформ общему знаменателю
● Сложность разработки UI с богатой стилизацией по макету
от дизайнера
19. 19
Чем WPF/UWP лучше остальных?
● Система привязок
(обходится XForms, Eto.Forms, MvvmCross)
20. 20
Чем WPF/UWP лучше остальных?
● Система привязок
(обходится XForms, Eto.Forms, MvvmCross)
● Человекочитаемая разметка, в которой можно верстать
(обходится XForms/Eto.Forms, так же нечто похожее есть в Android)
21. 21
Чем WPF/UWP лучше остальных?
● Система привязок
(обходится XForms, Eto.Forms, MvvmCross)
● Человекочитаемая разметка, в которой можно верстать
(обходится XForms/Eto.Forms, так же нечто похожее есть в Android)
● Структура контролов на шаблонах
26. 26
Преимущества контролов без внешнего вида
(lookless)
● Отделение логики работы и свойств
контрола от его представления
● Возможность менять вид контрола
практически любым образом по месту
использования
28. 28
Чего мы хотим от UI-фреймворка?
● Все плюшки WPF
● Переносимость
● Open-source
● 100% managed-код
● Рендеринг «пиксель-в-пиксель» везде
● Использование новых фич языка и экосистемы
41. 41
TopLevel
Элемент верхнего
уровня
События ввода и
отрисовка
WindowBase
Окно на экране
Перемещение,
смена размера, активность,
скрытие
Window
Окно с декорациями
(заголовок, кнопки)
Иерархия виджетов верхнего уровня
42. 42
TopLevel
Элемент верхнего
уровня
События ввода и
отрисовка
WindowBase
Окно на экране
Перемещение,
смена размера, активность,
скрытие
Popup
Topmost окно без рамки
Window
Окно с декорациями
(заголовок, кнопки)
Иерархия виджетов верхнего уровня
43. 43
TopLevel
Элемент верхнего
уровня
События ввода и
отрисовка
WindowBase
Окно на экране
Перемещение,
смена размера, активность,
скрытие
Popup
Topmost окно без рамки
Window
Окно с декорациями
(заголовок, кнопки)
EmbeddableControlRoot
TopLevel с поддержкой передачи
фокуса
Иерархия виджетов верхнего уровня
45. 45
Проблемы наивного метода отрисовки
(рекурсивно бежим по сцене)
● Сложно понять, что надо отрисовывать, а что нет
● Занимаем много времени на UI-потоке
● Полупрозрачная отрисовка тормозит
● Отрисовка с поворотами и масштабированием
тормозит (особенно шрифты)
52. 52
Отличия от WPF
● AvaloniaObject (то же самое, что и DependencyObject)
● Использует ReactiveExtensions
● Другая система стилей
● Отличия в иерархии контролов
● AvaloniaProperty
(как DependencyProperty, но строго типизирована)
- StyledProperty
- DirectProperty
56. 56
Чего пока нет?
(версия 0.5)
● Стабильности внутреннего API
● Не хватает многих подсистем, таких как API работы со шрифтами и
обработки тач-событий
● Поддержка мобильных устройств на экспериментальном уровне
● «Умный» рендерер пока не в главной ветке
● Для деплоя требует знания целевых платформ
● Документация :(
● Интеграция с IDE
● Выловлены не все проблемы с особенностями платформ
63. 63
a) 220, 230 б) 230, 220
в) 220, 268 г) 180, 170
д) правильного ответа
среди вариантов нет
64. 64
Запланировано на 0.6
● Генерация бандлов для OSX и пакетов для линукса в один
клик
● Переезд на Portable.Xaml
● Нативный бакэнд для OSX
● Сделать превьювер для *nix-платформ и интегрировать его
хоть куда-нибудь
● Доделать рендерер в отдельном потоке
● Доработать документацию