SlideShare a Scribd company logo
1 of 65
Download to read offline
2
3
4
5
6
7
8
9
10
11
12
13
14
В чём проблемы обёрток над нативными
контролами?
15
В чём проблемы обёрток над нативными
контролами?
16
В чём проблемы обёрток над нативными
контролами?
● Приведение к платформ общему знаменателю
17
В чём проблемы обёрток над нативными
контролами?
● Приведение к платформ общему знаменателю
● Сложность разработки UI с богатой стилизацией по макету
от дизайнера
18
Чем WPF/UWP лучше остальных?
19
Чем WPF/UWP лучше остальных?
● Система привязок
(обходится XForms, Eto.Forms, MvvmCross)
20
Чем WPF/UWP лучше остальных?
● Система привязок
(обходится XForms, Eto.Forms, MvvmCross)
● Человекочитаемая разметка, в которой можно верстать
(обходится XForms/Eto.Forms, так же нечто похожее есть в Android)
21
Чем WPF/UWP лучше остальных?
● Система привязок
(обходится XForms, Eto.Forms, MvvmCross)
● Человекочитаемая разметка, в которой можно верстать
(обходится XForms/Eto.Forms, так же нечто похожее есть в Android)
● Структура контролов на шаблонах
22
23
24
<Border
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}" ...>
<ContentPresenter
ContentTemplate="{TemplateBinding ContentTemplate}
Content="{TemplateBinding Content}" .../>
</Border>
25
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" TargetName="border" Value="#FFBEE6F
<Setter Property="BorderBrush" TargetName="border" Value="#FF3C7F
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" TargetName="border" Value="#FFC4E5F
<Setter Property="BorderBrush" TargetName="border" Value="#FF2C62
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Background" TargetName="border" Value="#FFF4F4F
<Setter Property="BorderBrush" TargetName="border" Value="#FFADB2
<Setter Property="TextElement.Foreground" TargetName="contentPres
</Trigger>
</ControlTemplate.Triggers>
26
Преимущества контролов без внешнего вида
(lookless)
● Отделение логики работы и свойств
контрола от его представления
● Возможность менять вид контрола
практически любым образом по месту
использования
27
ДЕМО
28
Чего мы хотим от UI-фреймворка?
● Все плюшки WPF
● Переносимость
● Open-source
● 100% managed-код
● Рендеринг «пиксель-в-пиксель» везде
● Использование новых фич языка и экосистемы
29
AvaloniaUI
(netstandard1.1)
● биндинги
● logical/visual tree
● рендерер(ы)
● контролы
● прочее
30
AvaloniaUI
(netstandard1.1)
● биндинги
● logical/visual tree
● рендерер(ы)
● контролы
● прочее
Avalonia.Xaml
(netstandard1.1)
31
AvaloniaUI
(netstandard1.1)
● биндинги
● logical/visual tree
● рендерер(ы)
● контролы
● прочее
Avalonia.Xaml
(netstandard1.1)
Avalonia.DefaultTheme
(netstandard1.1)
32
AvaloniaUI
(netstandard1.1)
● биндинги
● logical/visual tree
● рендерер(ы)
● контролы
● прочее
Avalonia.Xaml
(netstandard1.1)
Avalonia.DefaultTheme
(netstandard1.1)
IRuntimePlatform
.NET4.5+/Mono
.NET Core
Xamarin.*
33
AvaloniaUI
(netstandard1.1)
● биндинги
● logical/visual tree
● рендерер(ы)
● контролы
● прочее
Avalonia.Xaml
(netstandard1.1)
Avalonia.DefaultTheme
(netstandard1.1)
IRenderingPlatform
Direct2D
Skia
Cairo
IRuntimePlatform
.NET4.5+/Mono
.NET Core
Xamarin.*
34
Matrix Transform { get; set; }
void Clear(Color color);
void DrawImage(IBitmapImpl src, double opacity, Rect sect, Rect dest)
void DrawLine(Pen pen, Point p1, Point p2);
void DrawGeometry(IBrush brush, Pen pen, IGeometryImpl geometry);
void DrawRectangle(Pen pen, Rect rect, float cornerRadius);
void DrawText(IBrush color, Point origin, IFormattedTextImpl text);
void FillRectangle(IBrush brush, Rect rect, float cornerRadius);
void PushClip(Rect clip);
void PushOpacity(double opacity);
IDrawingContextImpl
35
36
AvaloniaUI
(netstandard1.1)
● биндинги
● logical/visual tree
● рендерер(ы)
● контролы
● прочее
Avalonia.Xaml
(netstandard1.1)
Avalonia.DefaultTheme
(netstandard1.1)
IWindowingPlatform
Win32
GTK#
GTK3
Xamarin.iOS
Xamarin.Android
...
IRenderingPlatform
Direct2D
Skia
Cairo
IRuntimePlatform
.NET4.5+/Mono
.NET Core
Xamarin.*
37
Size ClientSize { get; }
double Scaling { get; }
IEnumerable<object> Surfaces { get; }
Action<RawInputEventArgs> Input { get; set; }
Action<Rect> Paint { get; set; }
Action<Size> Resized { get; set; }
Action<double> ScalingChanged { get; set; }
void Invalidate(Rect rect);
void SetInputRoot(IInputRoot inputRoot);
Point PointToClient(Point point);
Point PointToScreen(Point point);
void SetCursor(IPlatformHandle cursor);
Action Closed { get; set; }
ITopLevelImpl
38
Size ClientSize { get; }
double Scaling { get; }
IEnumerable<object> Surfaces { get; }
Action<RawInputEventArgs> Input { get; set; }
Action<Rect> Paint { get; set; }
Action<Size> Resized { get; set; }
Action<double> ScalingChanged { get; set; }
void Invalidate(Rect rect);
void SetInputRoot(IInputRoot inputRoot);
Point PointToClient(Point point);
Point PointToScreen(Point point);
void SetCursor(IPlatformHandle cursor);
Action Closed { get; set; }
ITopLevelImpl
39
TopLevel
Элемент верхнего
уровня
События ввода и
отрисовка
Иерархия виджетов верхнего уровня
40
TopLevel
Элемент верхнего
уровня
События ввода и
отрисовка
WindowBase
Окно на экране
Перемещение,
смена размера, активность,
скрытие
Иерархия виджетов верхнего уровня
41
TopLevel
Элемент верхнего
уровня
События ввода и
отрисовка
WindowBase
Окно на экране
Перемещение,
смена размера, активность,
скрытие
Window
Окно с декорациями
(заголовок, кнопки)
Иерархия виджетов верхнего уровня
42
TopLevel
Элемент верхнего
уровня
События ввода и
отрисовка
WindowBase
Окно на экране
Перемещение,
смена размера, активность,
скрытие
Popup
Topmost окно без рамки
Window
Окно с декорациями
(заголовок, кнопки)
Иерархия виджетов верхнего уровня
43
TopLevel
Элемент верхнего
уровня
События ввода и
отрисовка
WindowBase
Окно на экране
Перемещение,
смена размера, активность,
скрытие
Popup
Topmost окно без рамки
Window
Окно с декорациями
(заголовок, кнопки)
EmbeddableControlRoot
TopLevel с поддержкой передачи
фокуса
Иерархия виджетов верхнего уровня
44
ДЕМО
45
Проблемы наивного метода отрисовки
(рекурсивно бежим по сцене)
● Сложно понять, что надо отрисовывать, а что нет
● Занимаем много времени на UI-потоке
● Полупрозрачная отрисовка тормозит
● Отрисовка с поворотами и масштабированием
тормозит (особенно шрифты)
46
47
48
Button
TextBlock
Button
Border
ContentPresenter
TextBlock
Logical Tree Visual Tree Render Tree
49
Button
TextBlock
Button
Border
ContentPresenter
TextBlock
VisualNode
VisualNode
VisualNode
VisualNode
Logical Tree Visual Tree Render Tree
50
Button
TextBlock
Button
Border
ContentPresenter
TextBlock
VisualNode
VisualNode
VisualNode
VisualNode
FillRectangle
DrawRectangle
DrawText
Logical Tree Visual Tree Render Tree
51
ДЕМО
52
Отличия от WPF
● AvaloniaObject (то же самое, что и DependencyObject)
● Использует ReactiveExtensions
● Другая система стилей
● Отличия в иерархии контролов
● AvaloniaProperty
(как DependencyProperty, но строго типизирована)
- StyledProperty
- DirectProperty
53
public static readonly DirectProperty<TextBox, int>
SelectionEndProperty =
AvaloniaProperty.RegisterDirect<TextBox, int>(
nameof(SelectionEnd),
o => o.SelectionEnd,
(o, v) => o.SelectionEnd = v);
54
public static readonly DirectProperty<TextBox, int>
SelectionEndProperty =
AvaloniaProperty.RegisterDirect<TextBox, int>(
nameof(SelectionEnd),
o => o.SelectionEnd,
(o, v) => o.SelectionEnd = v);
public int SelectionEnd
{
get { return _selectionEnd; }
set { SetAndRaise(SelectionEndProperty, ref
_selectionEnd, CoerceCaretValue(value)); }
}
55
ДЕМО
56
Чего пока нет?
(версия 0.5)
● Стабильности внутреннего API
● Не хватает многих подсистем, таких как API работы со шрифтами и
обработки тач-событий
● Поддержка мобильных устройств на экспериментальном уровне
● «Умный» рендерер пока не в главной ветке
● Для деплоя требует знания целевых платформ
● Документация :(
● Интеграция с IDE
● Выловлены не все проблемы с особенностями платформ
57
58
59
60
61
62
a) 220, 230 б) 230, 220
в) 220, 268 г) 180, 170
63
a) 220, 230 б) 230, 220
в) 220, 268 г) 180, 170
д) правильного ответа
среди вариантов нет
64
Запланировано на 0.6
● Генерация бандлов для OSX и пакетов для линукса в один
клик
● Переезд на Portable.Xaml
● Нативный бакэнд для OSX
● Сделать превьювер для *nix-платформ и интегрировать его
хоть куда-нибудь
● Доделать рендерер в отдельном потоке
● Доработать документацию
65
https://github.com/AvaloniaUI/Avalonia
https://gitter.im/AvaloniaUI/Avalonia
AvaloniaUI.github.io
Спикер
Никита Цуканов
nikita.d.tsukanov@gmail.com Skype: kekekeks

More Related Content

What's hot

Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьYauheni Akhotnikau
 
Mambility. Cтрах и ненависть к фрагментам
Mambility. Cтрах и ненависть к фрагментамMambility. Cтрах и ненависть к фрагментам
Mambility. Cтрах и ненависть к фрагментамOlga Golovach
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
 
Вадим Макеев "С ножом против паровоза 2. Оптимизация и нарезка графики для пр...
Вадим Макеев "С ножом против паровоза 2. Оптимизация и нарезка графики для пр...Вадим Макеев "С ножом против паровоза 2. Оптимизация и нарезка графики для пр...
Вадим Макеев "С ножом против паровоза 2. Оптимизация и нарезка графики для пр...Yandex
 
Аспектно ориентированное программирование для Java автоматизаторов
Аспектно ориентированное программирование для Java автоматизаторовАспектно ориентированное программирование для Java автоматизаторов
Аспектно ориентированное программирование для Java автоматизаторовCOMAQA.BY
 
введение в Javascript
введение в Javascriptвведение в Javascript
введение в Javascriptinqubick
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
 
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...solit
 
матлогика для программистов
матлогика для программистовматлогика для программистов
матлогика для программистовetyumentcev
 
У всех на виду: нюансы Open Source разработки
У всех на виду: нюансы Open Source разработкиУ всех на виду: нюансы Open Source разработки
У всех на виду: нюансы Open Source разработкиCUSTIS
 

What's hot (10)

Погружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная частьПогружение в SObjectizer 5.5. Вводная часть
Погружение в SObjectizer 5.5. Вводная часть
 
Mambility. Cтрах и ненависть к фрагментам
Mambility. Cтрах и ненависть к фрагментамMambility. Cтрах и ненависть к фрагментам
Mambility. Cтрах и ненависть к фрагментам
 
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кодаАндрей Карпов, Приватные байки от разработчиков анализатора кода
Андрей Карпов, Приватные байки от разработчиков анализатора кода
 
Вадим Макеев "С ножом против паровоза 2. Оптимизация и нарезка графики для пр...
Вадим Макеев "С ножом против паровоза 2. Оптимизация и нарезка графики для пр...Вадим Макеев "С ножом против паровоза 2. Оптимизация и нарезка графики для пр...
Вадим Макеев "С ножом против паровоза 2. Оптимизация и нарезка графики для пр...
 
Аспектно ориентированное программирование для Java автоматизаторов
Аспектно ориентированное программирование для Java автоматизаторовАспектно ориентированное программирование для Java автоматизаторов
Аспектно ориентированное программирование для Java автоматизаторов
 
введение в Javascript
введение в Javascriptвведение в Javascript
введение в Javascript
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программах
 
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
Solit 2013, Советы по написанию кода: именование, массивы и перечисления, Вор...
 
матлогика для программистов
матлогика для программистовматлогика для программистов
матлогика для программистов
 
У всех на виду: нюансы Open Source разработки
У всех на виду: нюансы Open Source разработкиУ всех на виду: нюансы Open Source разработки
У всех на виду: нюансы Open Source разработки
 

Similar to Никита Цуканов - "Avalonia UI Cross-platform Open Source UI Framework"

Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?etyumentcev
 
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)SIPLABS Communications
 
Adobe Flash. Знакомство.
Adobe Flash. Знакомство.Adobe Flash. Знакомство.
Adobe Flash. Знакомство.Yulya Borshchova
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентовRoman Brovko
 
Mihail Korepanov
Mihail KorepanovMihail Korepanov
Mihail Korepanovyaevents
 
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...Yandex
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотомRoman Grebennikov
 
Вадим Макишвили "Вёрстка в IntelliJIDEA"
Вадим Макишвили "Вёрстка в IntelliJIDEA"Вадим Макишвили "Вёрстка в IntelliJIDEA"
Вадим Макишвили "Вёрстка в IntelliJIDEA"Yandex
 
Практическое применение WebWorkers / Алексей Фомкин (Data Monsters)
Практическое применение WebWorkers / Алексей Фомкин (Data Monsters)Практическое применение WebWorkers / Алексей Фомкин (Data Monsters)
Практическое применение WebWorkers / Алексей Фомкин (Data Monsters)Ontico
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersAleksey Fomkin
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...e-Legion
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекPython Meetup
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Anthony Marchenko
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Ontico
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинSergey Xek
 
Тестирование безDOMных объектов
Тестирование безDOMных объектовТестирование безDOMных объектов
Тестирование безDOMных объектовSQALab
 
использование .Net framework
использование .Net frameworkиспользование .Net framework
использование .Net frameworkjskonst
 
Scino: Developing for Windows Phone [part-1]
Scino: Developing for Windows Phone [part-1]Scino: Developing for Windows Phone [part-1]
Scino: Developing for Windows Phone [part-1]SCINO
 

Similar to Никита Цуканов - "Avalonia UI Cross-platform Open Source UI Framework" (20)

Как жить в согласии с SOLID?
Как жить в согласии с SOLID?Как жить в согласии с SOLID?
Как жить в согласии с SOLID?
 
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
KAZOOMEETUP MOSCOW 2015. Михаил Родионов. Введение в KAZOO (KAZOO 101)
 
Adobe Flash. Знакомство.
Adobe Flash. Знакомство.Adobe Flash. Знакомство.
Adobe Flash. Знакомство.
 
04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов04 - Практика UML. Описание прецедентов
04 - Практика UML. Описание прецедентов
 
Mihail Korepanov
Mihail KorepanovMihail Korepanov
Mihail Korepanov
 
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
Михаил Корепанов "Скорость рендеринга страниц: исследования, замеры, автомати...
 
Scala performance под капотом
Scala performance под капотомScala performance под капотом
Scala performance под капотом
 
Вадим Макишвили "Вёрстка в IntelliJIDEA"
Вадим Макишвили "Вёрстка в IntelliJIDEA"Вадим Макишвили "Вёрстка в IntelliJIDEA"
Вадим Макишвили "Вёрстка в IntelliJIDEA"
 
Практическое применение WebWorkers / Алексей Фомкин (Data Monsters)
Практическое применение WebWorkers / Алексей Фомкин (Data Monsters)Практическое применение WebWorkers / Алексей Фомкин (Data Monsters)
Практическое применение WebWorkers / Алексей Фомкин (Data Monsters)
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
 
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
#MBLTdev: Практический пример переиспользования кода. Как повысить качество и...
 
ОПК № 1 – Вводная
ОПК № 1 – ВводнаяОПК № 1 – Вводная
ОПК № 1 – Вводная
 
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотекSWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
 
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
Встраивание Python в мобильные приложения – нюансы interoperation, новые подх...
 
DDD Workshop
DDD WorkshopDDD Workshop
DDD Workshop
 
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
Javascript-фреймворки: должен остаться только один / Аверин Сергей (Acronis)
 
Javascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только одинJavascript-фреймворки:
 должен остаться только один
Javascript-фреймворки:
 должен остаться только один
 
Тестирование безDOMных объектов
Тестирование безDOMных объектовТестирование безDOMных объектов
Тестирование безDOMных объектов
 
использование .Net framework
использование .Net frameworkиспользование .Net framework
использование .Net framework
 
Scino: Developing for Windows Phone [part-1]
Scino: Developing for Windows Phone [part-1]Scino: Developing for Windows Phone [part-1]
Scino: Developing for Windows Phone [part-1]
 

Никита Цуканов - "Avalonia UI Cross-platform Open Source UI Framework"