Ленинский Букварь - все видео
Новые видео из канала RuTube на сегодня - 17 April 2026 г.
00:00 Введение и исправление ошибки • Добавлены внедрение зависимостей и заводской шаблон для загрузки страниц. • Смоделирован пользовательский интерфейс для страницы настроек в Affinity. • Цель — превратить модель в реальный код и интерфейс с помощью Avalonia, сосредоточившись на структуре, а не на стиле. • Исправлена ошибка с viewmodel времени разработки, требующей фабрику страниц. 00:53 Создание конструктора для разработки • Создан конструктор для установки текущей страницы на новую. • Конструктор прокомментирован как работающий только во время разработки. • Добавлены основной цвет фона и текста для визуального контроля. 01:53 Структура страницы • Основная область страницы разделена на несколько частей. • Верхний уровень представлен сеткой с двумя столбцами и двумя строками. • Сетка содержит заголовок и содержимое, разделённое на две части. 02:54 Работа над заголовком • Заголовок состоит из сетки с фоном и панелью с тремя текстами. • Фон экспортирован в формате SVG и добавлен в ресурсы. • Изображение привязано к источнику и растянуто на всю длину. 03:56 Настройка изображения • Изображение растянуто на всю ширину с сохранением пропорций. • Настроена высота изображения и режим растягивания. 05:58 Панель стека с надписями • Внутри заголовка создана панель стека с тремя надписями «Настройки». • Надписи выровнены по горизонтали по центру. 06:52 Основной контент • Основной контент разделён на две колонки. • Создана панель стека с заголовком для общих данных. • Настроены отступы и поля для элементов. 09:31 Добавление кнопки • Добавлена кнопка с текстом «Лицензия на выпуск» и символом блокировки. • Кнопка будет стилизована отдельно. • Явно определены строки для избежания путаницы. 10:28 Настройка размера окна • Кнопка занимает больше места, чем текст, из-за маленького окна. • Устанавливаем минимальный размер окна на 1240 пикселей для большинства мониторов. • Пропорционально увеличиваем высоту окна. 11:22 Минимальный размер и макет • Устанавливаем минимальный размер, чтобы избежать прокрутки страницы вниз. • Сосредотачиваемся на макете, игнорируя стилистику. • Рассчитываем ширину проекта: 1400 пикселей, учитывая боковое меню и отступы. 12:20 Создание общего раздела • Создаём текстовый блок с переносом текста wrap. • Устанавливаем сетку без отступов, которые добавим позже с помощью стилей. • Игнорируем текущее оформление, сосредотачиваясь на макете. 15:09 Локации и панель стека • Начинаем с метки и сетки для локаций. • Добавляем текстовый блок и кнопку с плюсом. • Визуализируем сетку с помощью линий. 17:50 Управление элементами • Создаём элемент управления элементами для списка. • Привязываем элемент управления к viewmodel. • Исправляем привязку данных для автоматического выбора элементов. 21:30 Правая сторона интерфейса • Создаём панель с ярлыком, текстовым полем и полем со списком. • Копируем настройки левой стороны на правую. • Добавляем панель управления стеком для хоста SolidWorks. 22:39 Текстовый блок и перенос текста • Установка значения wrap для переноса текста в текстовом блоке. • Использование двоеточия в XML для добавления пробелов, но это не идеально. • Добавление специального элемента для переноса строки для более удобного управления пробелами. 23:46 Поле со списком • Поле со списком будет работать с привязкой данных и сервиса, а не с IP-адресами. • Хосты пакетного процесса будут транслировать свои IP-адреса для обнаружения. • Раздел PDM Enterprise будет представлять собой панель со стеками. 24:27 Панель управления стеком • Горизонтальная панель стека с тремя элементами: кнопка «не вводить текст» или «комбинировать», поле со списком и два текстовых поля. • Интервалы должны соответствовать стилю, который будет применяться. 25:33 Сетка и кнопки • Создание сетки с определением столбцов из трёх чётных величин. • Две кнопки: «войти в систему» и «обновить хранилище», расположенные горизонтально. 27:09 Кэш настроек • Кэш настроек аналогичен PDM Enterprise: панель в виде стека с текстом и тремя элементами-кнопками. • Копирование настроек PDM Enterprise и сохранение их в кэше. • Добавление кнопок для очистки кэша, экспорта и импорта кэша. 30:07 Стилизация и выравнивание • Важность единообразия отступов и интервалов между элементами. • Применение визуальных стилей для улучшения внешнего вида интерфейса. • Использование сеток для элементов, занимающих всю ширину или высоту, и стековых панелей для элементов, складывающихся в стопку.00:00 Начало создания приложения • Проверка основ приложения перед переходом к полноценному проекту. • Создание пользовательского интерфейса с поддержкой MVVM. • Планирование добавления внедрения зависимостей для разделения классов и повышения гибкости. 00:56 Добавление внедрения зависимостей • Установка пакета Microsoft Dependency Injection. • Перенос модели основного представления в внедрение зависимостей. 01:37 Концепция внедрения зависимостей • Объяснение важности указания всех зависимостей в одном месте. • Преимущества упрощения модульного тестирования и замены частей приложения. 02:14 Работа с коллекцией сервисов • Добавление одноэлементного объекта в коллекцию сервисов. • Создание поставщика услуг для предоставления сервисов. 03:07 Получение сервисов через внедрение зависимостей • Использование методов getService и getRequiredService для получения сервисов. • Проверка работы основной модели представления после внедрения зависимостей. 04:09 Внедрение дополнительных сервисов • Внедрение модели просмотра домашней страницы в качестве синглтона. • Разделение обязанностей между классами для повышения гибкости приложения. 05:44 Удаление ответственности из основной модели представления • Удаление создания страниц из основной модели представления. • Внедрение моделей просмотра страниц через внедрение зависимостей. 08:22 Проблемы с внедрением зависимостей • Обсуждение проблемы использования анти-шаблонов при внедрении поставщика услуг. • Необходимость создания временных объектов для оптимизации использования памяти. 09:24 Решение проблемы с временными объектами • Создание временных объектов при каждом вызове сервиса. • Избегание постоянного хранения экземпляров моделей просмотра. 10:15 Определение страниц другим способом • Перечисление страниц для оптимизации использования памяти. • Создание моделей просмотра только при необходимости. 10:45 Создание каталога и класса • Создаём новый каталог data. • Внутри каталога добавляем класс application page names в виде перечисления. • Перечисление представляет собой список с целыми числами и текстовыми значениями. 11:09 Модель просмотра страниц • Текущая страница представлена viewmodel, которая не хранит информацию о странице. • Добавляем класс page viewmodel, наследующий от base viewmodel. • В page viewmodel добавляем свойство page name для связи с названием страницы. 12:27 Настройка моделей просмотра • Изменяем все viewmodel на page viewmodel. • Создаём конструкторы для каждой страницы, задавая название страницы. • Проверяем название страницы в главной модели просмотра. 13:57 Генерация новых страниц • Обсуждается необходимость генерации viewmodel при переходе на страницу. • Рассматривается использование поставщика услуг для генерации моделей просмотра. • Подчёркивается проблема статического использования поставщика услуг. 16:09 Фабричный шаблон • Внедряем фабричный шаблон для генерации моделей просмотра страниц. • Создаём папку factories и класс factory pages. • Фабрика страниц создаёт модели просмотра на основе названия страницы. 18:17 Реализация фабрики страниц • Внедряем фабрику страниц в модель основного представления. • Привязываемся к функции, которая генерирует модели просмотра при вызове. • Функция получает доступ к поставщику услуг для генерации моделей. 20:44 Создание новых экземпляров • Используем переключатель для создания новых экземпляров моделей просмотра. • Каждый раз при вызове службы генерируется новый экземпляр модели. • Удаляем старые экземпляры при изменении страниц. 21:19 Перехват по умолчанию • Добавляем функцию перехвата по умолчанию для новых страниц. • Функция перехвата удаляет старые модели при появлении новых страниц. • Обеспечиваем доступ к зависимости для вызова функции генерации моделей. 22:23 Внедрение зависимостей в конструкторе • В конструкторе используется внедрение зависимостей через коллекцию. • Создаётся функция-фабрика PageViewModelFactory, которая возвращает PageViewModel. • Фабрика сохраняется как частная функция, доступная только для чтения. 22:56 Работа с фабрикой страниц • Фабрика страниц представлена как функция-делегат, которую можно вызывать через invoke. • При вызове invoke выполняется метод, который создаёт PageViewModel на основе имени страницы. 24:11 Упрощение кода с помощью нового синтаксиса C# • В новом синтаксисе C# упрощается передача свойств в конструктор. • Создаётся закрытый элемент factory для фабрики страниц. • Функция getPageView используется для получения PageViewModel по имени страницы. 26:57 Преимущества внедрения зависимостей • Внедрение зависимостей усложняет работу, но обеспечивает чистоту классов. • Модель основного представления чётко определена и легко тестируется. • Фабрика страниц должна знать имена всех страниц приложения. 27:54 Анализ работы кода с точками останова 29:47 Принципы внедрения зависимостей 30:45 Заключение и планы на будущее00:00 Введение и цели видео • В предыдущем видео было реализовано боковое меню и анимации. • Теперь нужно добавить страницы для навигации по приложению. • При нажатии на кнопку «Домой» должна загружаться домашняя страница, а при нажатии на другие страницы — соответствующие страницы. • Настройки можно сделать в виде всплывающего окна или переместить в главное окно. 00:44 Реализация навигации по страницам • Тема видео — реализация навигации по страницам. • Начало с изучения шаблона идентификатора в MVVM. • Шаблон идентификатора позволяет указывать моделям данных, какой вид должен загружаться. 01:18 Принцип работы шаблона идентификатора • Match проверяет, соответствует ли модель данных типу viewmodel. • Если совпадение найдено, вызывается метод build, который возвращает элемент управления. • Это позволяет привязывать элементы управления контентом и другие элементы пользовательского интерфейса. 03:33 Создание папок и видов • Создание папки «Просмотры» и перетаскивание в неё основного вида. • Создание пользовательского элемента управления Avalonia для домашней страницы. • Создание второй страницы — страницы процесса. 04:14 Настройка сетки и проверка работы • Размещение видов в сетке на главном экране. • Исправление ошибок с ресурсами и изображениями. • Временное добавление стилей для демонстрации работы страницы. 05:44 Динамическая привязка к viewmodel • Переход от привязки к конкретному виду к привязке к viewmodel. • Создание базы моделей приватного просмотра и концепции текущей страницы. • Привязка к observable свойству текущей страницы. 07:18 Реализация моделей просмотра страниц • Создание модели просмотра домашней страницы и страницы процесса. • Использование view locator для преобразования моделей просмотра в реальные виды. • Временное использование свойств для доказательства работы привязки. 08:43 Настройка конструктора и отладка • Установка текущей страницы по умолчанию в конструкторе. • Привязка содержимого к текущей странице. • Отладка с помощью точек останова для проверки работы привязки. 10:12 Добавление шаблонов данных приложения • Добавление шаблонов данных приложения и локатора просмотра. • Проверка соответствия данных модели просмотра. • Возвращение нового вида домашней страницы при успешной привязке. 11:30 Статический вид домашней страницы • Компиляция возвращает домашнюю страницу, но она статична. • Изменение страницы на страницу процесса не меняет результат. • Необходимо вернуть определённый тип на основе viewmodel. 12:00 Проверка viewmodel и поиск представления • Проверка, содержит ли название viewmodel. • Поиск представления с тем же именем, но с «view» вместо «viewmodel». • Нулевая проверка данных перед возвратом. 13:32 Рефлексия и создание элемента управления • Получение типа viewmodel с помощью рефлексии. • Создание нового элемента управления на основе типа. • Привязка модели представления к представлению через контекст данных. 14:41 Пример с моделью просмотра страницы процесса • Получение модели просмотра страницы процесса. • Замена «viewmodel» на «view» в полном имени. • Создание нового экземпляра представления и привязка контекста данных. 15:26 Тестирование генерации представлений • Проверка работы генерации представлений с моделью просмотра «test». • Настройка datacontext для отображения содержимого. • Временное удаление стилей для тестирования. 16:58 Команды для переключения страниц • Создание команд для перехода на главную страницу и страницу процесса. • Привязка кнопок к командам для изменения текущей страницы. • Исправление ошибок при компиляции. 19:15 Стилизация активных страниц • Настройка цвета фона для активной страницы. • Обновление стилей для активного фона и наведения курсора. • Привязка стиля кнопки к активному состоянию страницы. 22:08 Обновление стилей при изменении страницы • Наблюдение за свойством текущей страницы. • Уведомление об изменении свойства для класса кнопок. • Повторное обновление стилей при изменении текущей страницы. 23:12 Стилизация остальных кнопок • Аналогичная настройка для кнопки «Обработать» и других кнопок. • Использование закрытого класса active button для краткости. 23:45 Открытие двойной панели • Обсуждение процесса нажатия кнопки и открытия двойной панели. • Упоминание о частной строке const и классе кнопки active. 24:07 Привязка и стилизация кнопок • Необходимость выполнения привязки для обновления изображения. • Добавление класса active к кнопке при её активации. • Работа со стилями: границы, надписи, кнопки и указатель мыши. 25:00 Работа с классами и привязками • Изменение фона на значение динамического ресурса primary active background. • Использование массива классов для упрощения задачи. • Привязка к определённому объекту и стилизация представления. 25:58 Свойства активных страниц 26:40 Визуальный стиль и навигация 27:19 Завершение работы03. Реальный мир пользовательского интерфейса Avalonia (Просмотр основ модели) 00:00 Введение в viewmodels • Viewmodels позволяют привязывать элементы пользовательского интерфейса к данным в фоновом режиме. • Без viewmodels обновление интерфейса происходит вручную, что неэффективно. • Изменение данных в базе данных должно автоматически обновлять представление. 00:28 Установка инструментария • В Avalonia используется инструментарий Community MVVM Toolkit. • Установка инструментария через терминал: `dotnet add package community.mvvm`. • Создание папки `viewmodels` и базовой модели представления. 01:20 Базовая модель представления • Базовая модель представления наследуется от `ObservableObject`. • `ObservableObject` управляет автоматическим запуском событий при изменении значений. 01:40 Модель главного окна • Создание модели главного окна, наследуемой от базовой модели. • Переименование главного окна в `MainView`. • Добавление свойства `test` с атрибутом `observable`. 04:12 Привязка данных • Настройка контекста данных окна на основную модель представления. • Привязка текста к свойству `test` в модели представления. • Обновление пользовательского интерфейса при изменении данных. 06:00 Работа с контекстом данных • Перенос настройки контекста данных в серверный код. • Использование специального контекста данных `design.data` для предварительного просмотра. 08:24 Создание разборного меню • Реализация функции сворачивания бокового меню. • Привязка логического значения `expandedSideMenu` к видимости меню. • Использование преобразователя значений для изменения изображения меню. 11:13 Настройка изображения бокового меню • Создание приватного свойства для изображения бокового меню в формате SVG. • Объявление свойства `imageOfSideMenu` как наблюдаемого. 11:31 Обновление изображения Avalonia Skia • Добавление свойства notify для обновления изображения при изменении значения. • Изменение названия свойства и его общедоступность. • Создание исходного кода SVG и передача пути к ресурсу. 12:32 Генерация SVG-кода • Получение исходного текста SVG вместо изображения. • Создание нового изображения с установленным исходным кодом. • Использование интерполированной строки для представления изображений ресурсов. 13:17 Настройка изображения • Установка развёрнутого изображения как логотипа или свёрнутого изображения как значка. • Обновление свойства notify при изменении расширенного бокового меню. • Проверка работы логики обновления изображения. 14:26 Исправление ошибок URL • Решение проблемы с относительным URL-адресом без базового URL-адреса. • Указание проекта и пространства имён для корректной работы ресурсов. • Тестирование обновления изображения при изменении значения. 15:27 Обработка двойного щелчка • Подключение изображения к отображению при двойном щелчке мыши. • Создание команды для обновления бокового меню. • Реализация логики двойного щелчка и вызова команды. 16:19 Создание команды для бокового меню • Определение команды для скрытия или показа меню. • Привязка команды к контексту данных модели представления. • Проверка нулевой безопасности и корректное выполнение команды. 18:54 Изменение размера изображения • Обсуждение специфичности размера изображения для вида. • Использование преобразователя значений для изменения размера изображения. • Привязка видимости изображения к расширенному боковому меню. 21:05 Анимация бокового меню • Настройка анимации расширения и сжатия бокового меню. • Проблемы с высотой при анимации и возможные решения. • Привязка ширины границы к ширине боковой панели для корректной анимации. 22:49 Анимация и модели просмотра • Обсуждение возможности получения анимации при произвольной ширине. • Идея наложения одного изображения на другое для создания эффекта сетки. • Планирование стирания одного изображения и уменьшения другого по ширине. • Фокус на моделях просмотра, а не на анимации. 23:53 Основы моделей просмотра • Объяснение использования команд и свойств для привязки функций и полей. • Объединение элементов пользовательского интерфейса с помощью оператора привязки. • Возвращение значения true по умолчанию. • Переход к созданию страниц и обмену кнопками между ними. • Подчёркивание важности основ моделей просмотра для быстрого продвижения в разработке.00:00 Запуск приложения Avalonia • Запуск нового приложения Avalonia с боковым меню и кнопками. • Цель: улучшить визуальный ряд, добавив значки и улучшив эффекты затухания. 00:23 Работа с кнопками • Добавление элементов внутри кнопки: использование панели стека для размещения ярлыков. • Изменение ориентации кнопки на горизонтальную. • Вставка изображений и значков слева от кнопок. 01:45 Использование шрифтов для значков • Загрузка шрифтов с GitHub или другого источника. • Создание папки «шрифты» в разделе «Ресурсы». • Вставка фосфорных шрифтов и шрифта Aco Pro. 02:52 Настройка шрифтов в Avalonia • Изменение действия «Создать» на «ресурсы Avalonia». • Создание семейства шрифтов и настройка путей к шрифтам. • Указание фактического названия шрифта в Windows и его физического имени. 05:16 Применение шрифтов • Назначение шрифта окну верхнего уровня для каскадного распространения. • Использование селектора window и свойства семейства шрифтов. • Исправление смещения шрифта с помощью отступов. 08:24 Работа с фосфорными шрифтами • Импорт фосфорных шрифтов в приложение XAML. • Создание класса иконок и ввод значений в юникоде. • Пример ввода юникода для символа «дом». 10:10 Ввод юникодов • Объяснение способа ввода юникодов с использованием хэш-тегов. • Пример ввода юникода для символа «uplius». 10:42 Работа со стилями и шрифтами • Важно ставить точку с запятой в конце кода, чтобы избежать ошибок компиляции. • Исправление проблем с выравниванием шрифтов с помощью значков и класса. • Создание стиля для кнопок и надписей, настройка отступов. 11:40 Настройка семейства шрифтов • Применение точечных значков к различным элементам интерфейса. • Настройка свойства семейства шрифтов и люминофорной заливки. • Использование точечного контроля для более гибкой настройки шрифтов. 12:27 Работа с отступами и полями • Настройка отступов для элементов интерфейса. • Копирование и вставка кода для создания пользовательского элемента управления. • Обновление юникодов для соответствия значкам. 13:36 Настройка значка «Настройки» • Создание сетки и строки для значка «Настройки». • Решение проблемы с центрированием значка при использовании полей вместо отступов. • Эксперименты с различными стилями для кнопки «Настройки». 14:27 Исправление ошибок со шрифтом • Временное удаление отступов для демонстрации ошибки в высоте шрифта. • Применение класса «echo» для исправления ошибок со шрифтом. • Настройка стилей для кнопок с разными комбинациями текста и значков. 16:58 Прозрачные кнопки • Добавление прозрачного стиля для кнопок. • Настройка свойства background для прозрачных кнопок. • Проверка работы прозрачных кнопок в реальном приложении. 19:15 Анимация кнопок • Настройка анимации масштабирования текста при наведении курсора. • Определение значения по умолчанию для масштаба рендеринга. • Игнорирование радиуса поворота при масштабировании надписей. 22:18 Завершение настройки анимации • Настройка переходов для анимации кнопок. • Оживление кнопок путём изменения цвета и масштаба. • Финальная проверка работы анимации. 22:44 Настройка переходов • Создаём новый массив переходов для масштабирования. • Устанавливаем длительность перехода в 0,1 секунды. • Проверяем анимацию масштабирования. 23:31 Анимация цвета фона • Копируем переходы для цвета фона. • Масштабируем весь контент, а не только ярлык. • Применяем внутренние переходы для цвета фона. 24:41 Проверка анимации • Проверяем продолжительность анимации. • Анимируем изменение переднего плана от белого до светло-белого. • Убеждаемся, что анимация работает. 25:02 Настройка свойств • Настраиваем свойство render transform по умолчанию. • Включаем анимацию переходов. • Проверяем работу анимации. 26:04 Визуализация приложения • Сравниваем макет и реальное приложение. • Отмечаем приятный эффект при наведении курсора. • Настраиваем отступы и шрифт по вкусу. 26:26 Настройка шрифтов • Выбираем семейство шрифтов для прозрачности. • Устанавливаем семейство шрифтов «динамический ресурс» или «люминофор». • Исправляем ошибку с значком на этикетке. 27:32 Завершение работы • Добавляем пользовательские шрифты и исправляем ошибки. • Добавляем анимацию на кнопки. • Планируем следующую работу: создание моделей просмотра и навигация по страницам.00:00 Введение в Avalonia • Avalonia — кроссплатформенный UI для разработки приложений на Windows, Mac, Linux, мобильных устройствах, веб-приложениях и Tizen. • Автор ранее выпускал статьи об Avalonia и теперь планирует переделать своё коммерческое приложение Batch Process с помощью Avalonia. 00:58 Начало работы с Avalonia • Набросок интерфейса в Affinity Designer будет преобразован в Avalonia. • Установка Avalonia через Visual Studio или JetBrains Rider, который теперь бесплатен. 01:55 Создание проекта • Выбор между кроссплатформенным приложением, приложением MVVM и .NET-приложением. • Создание нового проекта «Пакетная обработка 3» в Rider. 03:45 Проверка работы приложения • Запуск приложения и проверка его работы. • Открытие предварительного просмотра интерфейса. 04:42 Структура приложения • Описание структуры приложения: боковая панель, главное окно с сеткой. • Настройка цвета фона с помощью палитры цветов. 05:40 Работа со стилями • Создание папки styles и документа со стилями Avalonia. • Включение стилей в XAML-файл приложения. 06:39 Ресурсы приложения • Создание ресурса primary background для цвета фона. • Обновление приложения после внесения изменений. 07:38 Использование панелей и сетки • Объяснение различий между панелями стека и сеткой. • Применение сетки для заполнения пространства и фиксированного размера одного из столбцов. 09:23 Применение сетки • Настройка расположения элементов в сетке. • Примеры использования сетки для заполнения пространства и фиксированного размера. 10:20 Использование привязок в пользовательском интерфейсе • Привязки заменяют фиксированные значения, например, FFOOO для красного цвета. • Динамические ресурсы ищутся в ресурсах приложения. • Интерфейс напоминает веб-разработку, используя конструкции, похожие на CSS и HTML. 11:16 Импорт логотипа в формате SVG • Создание папки assets и подпапки images. • Вставка логотипа в папку images и изменение типа сборки на ресурс Avalonia. 12:10 Настройка контейнера и отступов • Использование панели стека и универсального элемента-обёртки Border для добавления отступов. • Задание отступа в 20 пикселей. • Добавление сетки для заполнения оставшегося пространства. 13:08 Привязка SVG-изображения • Настройка источника и вкладки привязки для SVG-изображения. • Установка пакета avalonia.svg.skia для поддержки SVG. • Указание пути к файлу logo.svg. 15:05 Настройка размеров изображения • Задание ширины изображения 220 и изменение на auto для автоматического размера. • Настройка дизайнерского размера 800x450 и реальных размеров 1024x600. 16:55 Создание градиента фона • Добавление линейной градиентной кисти с ключом primary background gradient. • Указание начальной и конечной точек градиента в процентах. • Задание цветов градиента: 111214 и 151E3E. 18:33 Добавление кнопок • Добавление кнопок под изображением, настройка переднего плана на белый. • Выравнивание текста по горизонтали для заполнения кнопки. • Настройка интервала между кнопками в панели стека. 21:02 Добавление кнопки настроек • Создание сетки с параметрами auto и fill для нижней строки. • Размещение кнопки настроек во втором ряду с индексом 1. • Настройка Grid.Row для кнопки настроек. 21:46 Настройка боковой панели и кнопок • Замена кнопки на иконку в настройках. • Боковая панель воссоздана в виде физических элементов. • Внутренняя часть будет настоящей страницей с шаблонным кодом для переходов между страницами. 22:44 Стилизация кнопок • Добавление градиентного фона и установка ширины кнопки 200. • Горизонтальное выравнивание по растяжению для кнопки. • Использование метода setter для настройки свойств кнопки. 23:44 Настройка шрифта и цветов • Установка размера шрифта 20. • Создание сплошной кисти primary text для светлого оттенка. • Применение динамического ресурса primary text для цвета foreground. 24:48 Стилизация наведения курсора • Создание стиля для наведения курсора на кнопку. • Выбор шаблона «Презентация контента» для настройки цвета при наведении. • Изменение цвета переднего плана и фона при наведении. 27:07 Завершение настройки • Проверка эффекта наведения при увеличении масштаба кнопки. • Пересоборка проекта для применения стилей. • Планы по улучшению: увеличение шрифта, уменьшение отступов, добавление иконок, анимация. 28:03 Преимущества Avalonia • Быстрое создание приложения с хорошим внешним видом. • Простота и интуитивность интерфейса Avalonia. • Сравнение с другими UI-фреймворками, такими как Maui. 29:01 Рекомендации по обучению • Приглашение задавать вопросы и смотреть другие видеоуроки по Avalonia. • Рекомендация курса по WPF для понимания основ UI-разработки. • Обещание готового приложения к концу курса.00:00 Введение и цель • Цель: отобразить реальный звук на панели и обеспечить прокрутку графика. • Проблема: значок на измерителе громкости Yulian не сразу реагирует на изменение громкости. 00:24 Обновление графика • Необходимость заставить график прокручиваться. • Использование кнопки «Постоянное изменение» для обновления графика. 00:53 Работа с наблюдаемыми значениями • Обновление рядов графика до наблюдаемых значений. • Создание наблюдаемого набора значений в модели представления. 02:15 Инициализация и проверка • Использование функции инициализации для настройки серии. • Проверка работы графика после изменений. 03:50 Анимация графика • Удаление и добавление элементов для анимации графика. • Добавление случайных значений для создания плавности. 06:08 Проблемы с потоком пользовательского интерфейса • Необходимость работы в потоке пользовательского интерфейса. • Решение проблемы с быстрым обновлением графика. 07:36 Обработка аудиоданных • Вставка значений реального звука в график. • Инверсия и корректировка значений для корректного отображения. 09:16 Настройка диапазона значений • Ограничение диапазона значений для имитации реального звучания. • Имитация белой полосы на графике при разговоре. 10:25 Сравнение с измерителем громкости • Сравнение графика с измерителем громкости Yulian. • Замечание о задержке и усреднении сигнала на измерителе громкости. 11:05 Заключение • Подчёркивание различий в отображении звука на графике и измерителе громкости. 11:16 Отсрочка и буфер • Создание очереди для отсрочки данных. • Рассмотрение возможности создания мини-класса для буфера. • Разделение требований между аудиосервисом и моделью представления. 12:02 Логика и график • Перенос звуковой логики в модель представления. • Добавление значений на график для краткосрочных колебаний. • Настройка уровня громкости. 13:45 Определение кратковременной громкости • Корректировка определений кратковременной громкости. • Обновление значений кратковременной громкости. • Ограничение размеров очередей. 16:04 Задержка и усреднение • Увеличение задержки для краткосрочных лофтов. • Сравнение мгновенных и усреднённых значений звука. • Влияние задержки на форму графика. 17:17 Математические операции • Использование максимального значения вместо среднего. • Анализ формы графика при использовании максимального значения. • Попытка сбалансировать задержку и детализацию графика. 20:26 Усреднение и очередь • Применение усреднения для улучшения графика. • Настройка очереди для средних значений. • Достижение более точного графика. 22:17 Освобождение очереди • Освобождение очереди при превышении средних значений. • Постоянное сокращение среднего значения. • Необходимость корректировки средних показателей. 23:30 Анализ пиков и роста • Обсуждение достижения пика и последующего устойчивого роста. • Упоминание о необходимости говорить громче для достижения пика. 24:09 Проблемы с очередью • Объяснение концепции «когда в среднем» для управления очередью. • Проблема потери среднего показателя при очистке очереди. • Решение увеличить размер очереди до 30 для поддержания среднего значения. 25:10 Сравнение с измерителем громкости • Сравнение текущего поведения с измерителем громкости по Джулиану. • Обнаружение пилообразного движения вверх-вниз вместо плавного. 26:09 Попытки улучшения • Предложение убрать 51 элемент из очереди при заполнении. • Добавление элементов обратно при снижении уровня. • Продолжение тестирования для улучшения поведения. 27:34 Итоги и дальнейшие шаги • Признание сложности математического расчёта обработки звука. • Удовлетворение текущим средним значением для отображения графика. • Планы по улучшению графика и добавлению временных рамок. 29:33 Заключение и планы • Подведение итогов работы над приложением. • Обсуждение возможности создания мобильного и кросс-платформенного приложения. • Призыв к зрителям предложить дальнейшие шаги.00:00 Обзор графиков для аудио • Обсуждение различных вариантов графиков для аудио, найденных через Discord. • Упоминание сюжета Скотта, поддерживаемого Avalonia, и микрокарт. • Переход к основному графику. 00:52 Изучение документации • Отсутствие примеров и документации для графиков. • Обзор PDF-документации, которая выглядит как линейный график. • Предпочтение живых графиков. 01:37 Установка и настройка проекта • Установка пакета Nougat и очистка проекта от ненужных частей. • Обновление проекта до версии preview 8 и .NET 7. • Добавление Live Chart Skier в проект. 03:22 Создание ViewModel и добавление диаграммы • Создание ViewModel и добавление свойства series. • Импорт недостающих ссылок и настройка представления. • Вставка диаграммы в пользовательский интерфейс. 04:44 Тестирование диаграммы • Проверка работы диаграммы и её анимации. • Необходимость автоматической прокрутки и добавления осей. • Настройка масштаба и элементов управления. 05:42 Настройка шкалы и картографирования • Настройка шкалы от 0 до -69. • Работа с картографами и всплывающими подсказками. • Автоматические обновления данных на основе ViewModel. 08:53 Настройка заливки и толщины линий • Использование однотонной краски для заливки. • Настройка толщины штриха и размера геометрии. • Удаление геометрии для улучшения вида графика. 11:33 Финальная настройка • Проверка направления заливки и расположения осей. • Дальнейшая настройка свойств заливки и линий. 11:39 Введение в заливку • Заливка включает сплошной цвет, геометрическую заливку и обводку штрихом. • Геометрическая заливка имеет точки. 11:51 Контроль направления заливки • Направление заливки кажется неконтролируемым. • Область заполняется выше и ниже нуля. 12:12 Создание собственной геометрии • Возможность создания собственной геометрии для заливки. • Идея инверсии данных для изменения направления заливки. 13:04 Управление осями • Отсутствие возможности управления осями в текущей версии. • Анализ API для получения информации об осях. 14:02 Инверсия оси Y • Привязка оси Y к графику. • Установка инвертированного значения оси. 15:23 Проблемы с заливкой • Инверсия оси не решает проблему заливки. • Необходимость изменения данных для инверсии заливки. 16:42 Настройка меток осей • Изменение меток осей и их положения. • Настройка минимального шага и делителя. 18:21 Ограничение данных • Ограничение значений от минимального до максимального. • Игнорирование значений за пределами диапазона. 19:23 Функция label • Функция label преобразует число в метку. • Инверсия функции label для преобразования чисел. 20:59 Преобразование значений • Ограничение значений от 0 до -60. • Преобразование отрицательных значений в положительные. • Преобразование чисел в метки. 22:11 Проблемы с математикой и данными • Обсуждение возможных ошибок в математике при работе с данными. • Манипуляции с данными для правильного заполнения диапазона от 0 до 60. • Необходимость инверсии значений для корректного отображения. 23:10 Обработка данных и создание меток • Обработка данных, поступающих в таблицу, для создания меток. • Получение правильного графика с правильным расположением осей. • Попытка ограничить диапазон отрицательных значений. 23:30 Работа с метками и осью • Обсуждение возможности скрытия меток и использования значений null или blank. • Проблемы с отображением меток при возврате значения null. • Анализ поведения меток при выходе за пределы коллекции. 25:51 Создание собственной оси • Решение скрыть существующую ось и создать новую. • Наложение сетки поверх графика и проведение линий. • Добавление отступов для уменьшения размера оси. 26:52 Настройка сетки и элементов • Использование той же сетки, что и для счётчика. • Создание прямоугольника внутри элемента сетки. • Настройка ориентации и заливки элементов. 28:15 Добавление меток и корректировка стиля • Добавление меток с нулевым значением содержимого. • Корректировка размера надписи и добавление полосы с линией. • Настройка непрозрачности и высоты элементов. 31:07 Проверка и корректировка сетки • Проверка заполнения сетки и устранение проблем с выравниванием. • Корректировка вертикального выравнивания и непрозрачности. • Вставка дополнительных элементов для заполнения пробелов. 35:06 Финальная настройка сетки • Удаление определений столбцов и использование автоопределения. • Размещение всех надписей в один столбец и прямоугольников — в один. • Уточнение настроек сетки и строк для корректного отображения. 35:49 Создание сетки и выравнивание текста • Обсуждение создания сетки с количеством строк до девяти. • Настройка горизонтального выравнивания текста для смещения вправо. • Достижение идеального выравнивания текста и прямой линии. 36:55 Прокрутка графиков 37:54 Работа с данными и диаграммами 38:54 Заключение00:00 Запуск Avalonia на Windows • Программа Avalonia должна быть кроссплатформенной и работать на Windows. • Проект открыт в Visual Studio, приложение для настольных компьютеров запускается. • Звук не воспроизводится, но микрофон работает нормально. 00:38 Добавление панели регулировки громкости • Планируется добавить панель регулировки громкости с анимацией. • Идея: белый цвет расширяется вверх, затем появляется красный при достижении определённой линии. 01:07 Настройка ViewModel • Добавление новой частной собственности для высоты панели регулировки громкости. • Высота контейнера volume задаётся в коде, а не в конструкторе. 02:44 Создание панели регулировки громкости в конструкторе • Создание панели регулировки громкости с именем volume bar. • Связывание высоты полосы громкости с высотой отскока полосы громкости. 04:21 Настройка высоты панели регулировки громкости • Определение высоты панели регулировки громкости в обратном вызове данных. • Расчёт высоты панели на основе уровня громкости в децибелах. 06:04 Исправление ошибок в отображении • Проблема с отображением панели регулировки громкости из-за отсутствия привязки. • Обновление устройства и проверка захвата микрофона. 09:28 Оптимизация отображения панели • Вертикальное выравнивание панели регулировки громкости. • Медленное обновление значений громкости. 10:39 Улучшение отображения стрелки регулировки громкости • Расчёт высоты стрелки регулировки громкости на основе уровня громкости. • Стрелка становится более отзывчивой, но частота обновления остаётся низкой. 11:57 Настройка частоты обновления • Настройка частоты обновления сервиса захвата. • На Mac частота обновления по умолчанию выше, чем на Windows. • Смягчение слишком быстрой частоты обновления. 12:46 Настройка плавности движений • Обсуждение необходимости замедления периода для достижения плавности движений. • Упоминание о возможном увеличении числа до двадцати для достижения желаемого результата. 13:56 Усреднение значений • Применение среднего значения из трёх для сглаживания движений. • Идея удвоения среднего значения для другой стрелки. 14:31 Замедление обновления текста • Предложение использовать счётчик для обновления текста каждые три раза. • Реализация счётчика обновлений для текста и графиков. 17:07 Инверсия значений • Необходимость инверсии значений для правильного отображения громкости. • Объяснение использования поддельных значений для наглядности. 17:48 Ограничение значений • Ограничение максимального значения в пользовательском интерфейсе до 60. • Настройка высоты шкалы громкости и контейнера громкости. 19:00 Работа с аудиосервисом • Переработка кода для повторного использования аудиосервиса. • Добавление функций запуска и остановки записи. 22:21 Инициализация и освобождение устройств • Инициализация захвата звука с определённого устройства. • Освобождение ресурсов при остановке записи. 23:57 Проверка интерфейса • Проверка работы интерфейса после всех изменений. • Подготовка к добавлению графика. 24:15 Исследование графиков • Обзор документации Skia и Avalonia для построения графиков. • Упоминание обновлений и новых возможностей. 26:01 Работа с образцами • Изучение образцов и предварительного просмотра. • Оценка улучшений в документации и образцах. 26:13 Начало обсуждения рисования • Обсуждение рисования в целом, а не только графиков. • Упоминание шаблонов данных, рутины и пользовательских стилей. 26:29 Анализ образцов • Образцы не соответствуют ожиданиям. • Отсутствие конкретных решений в имеющихся образцах. 26:42 Поиск решений • Проверка наличия графиков в доступных решениях. • Поиск дополнительных ресурсов через Google. 27:15 Специфические требования • Необходимость рисования кривых в пользовательском интерфейсе. • Использование специфически настроенного элемента управления. • Возможность полного контроля над процессом рисования. 27:56 Начало реализации • Начало работы над программированием, графикой и анимацией. • Создание эллипсов, линий, многоугольников и графиков. • Планирование создания специального элемента управления для передачи аудиоданных. 27:56 Заключение • Подведение итогов обсуждения. • Надежда на полезность материала. • Анонс следующего выпуска.00:00 Введение и установка библиотеки • Замена кода вывода изображения на код обработки звука. • Использование библиотеки NVVI для обработки звука. • Установка библиотеки через меню Avalonia Loudness. 00:37 Обзор возможностей NVVI • NVVI работает с дискретными сигналами, позволяя обрабатывать аудиосэмплы. • Возможность извлечения данных, таких как уровень громкости и частота. • Утилиты для преобразования сигналов в децибелы и другие единицы измерения. 01:35 Измерение громкости • Фокус на измерении сигнала громкости. • Отображение значения громкости в разных форматах: число, полоса со стрелкой, интегрированная динамика. • Объяснение формата WAV как файла PCM с 16 битами на сэмпл. 02:33 Преобразование буфера данных • Преобразование необработанного буфера данных в значение громкости. • Привязка значения громкости к свойству в модели представления. • Создание приватного вспомогательного класса для обработки данных. 04:55 Захват звука • Создание устройства захвата звука. • Начало захвата звука и обработка данных. • Управление устройством захвата и его удаление при закрытии приложения. 07:49 Анализ данных WAV • Анализ формата WAV как шестнадцатибитного PCM-файла. • Вычисление количества сэмплов в буфере. • Преобразование буфера в дискретный сигнал с частотой дискретизации 44100 Гц. 11:02 Извлечение значений сэмплов • Извлечение шестнадцатибитных значений сэмплов из буфера. • Использование бинарного ридера для чтения данных. • Деление значений на 32768 для преобразования в формат с плавающей запятой. 12:42 Расчёт громкости в децибелах • Выражение значения громкости в децибелах. • Использование вспомогательного класса Scale для преобразования значений. • Получение значения громкости в децибелах с помощью класса Scale. 13:27 Вычисление децибел • Использование RMS для вычисления децибел. • RMS рассматривается как среднее значение энергии сигнала. 13:58 Установка модели представления • Переход в новый поток для установки модели представления. • Выполнение команды для установки значения краткосрочной громкости. 14:31 Проблемы с вычислением • Вычисление лофтов для каждого сэмпла и обновление пользовательского интерфейса. • Обнаружение некорректного поведения значений. 15:35 Анализ краткосрочных значений • Сравнение краткосрочных и усреднённых значений. • Усреднённое значение остаётся на уровне 20, в то время как краткосрочное падает до −50. 16:34 Разработка алгоритма усреднения • Использование таймера для усреднения образцов за секунду. • Расчёт новых средних значений на основе данных за секунду. 17:15 Реализация алгоритма усреднения • Создание массива чисел с плавающей запятой для хранения образцов. • Замена списка на стек для удобства добавления и удаления элементов. 19:16 Исправление ошибок в алгоритме • Исправление логики добавления и удаления элементов в стеке. • Переход на использование очереди для корректного извлечения элементов. 20:23 Тестирование и корректировка • Тестирование усреднённых значений с 40 выборками. • Обнаружение некорректных расчётов и необходимость корректировки средних значений. 21:32 Обработка стрелки и полосы • Сопоставление значения стрелки с кратковременными углами наклона. • Расчёт размера полосы на основе мгновенных углов наклона. 22:01 Заключение • Призыв к участию в Discord для дальнейшего обсуждения и разработки. • Подчёркивание важности наличия информации о звуке и громкости. • Обещание продолжить работу над графиком и функциональностью приложения.00:00 Начало работы со звуком • Настройка звука в LUFs. • Привязка пользовательского интерфейса Avalonia к звуковому коду. • Планирование создания подвижного графика. 00:37 Очистка кода и объединение сервисов • Удаление ненужного кода и очистка основного файла просмотра. • Объединение службы захвата звука и интерфейса. • Переименование объединённого сервиса в «Сервис захвата звука». 02:21 Создание фиктивной модели • Удаление фиктивного снимка и создание объединённого сервиса. • Добавление идентификатора по умолчанию для фиктивных объектов. 03:10 Комментарии и документация • Добавление комментариев к коду для улучшения документации. • Перенос функций в службу захвата звука. 05:01 Оптимизация кода • Удаление ненужных комментариев и очистка кода. • Минимизация количества личных пользователей. 06:37 Инициализация службы захвата • Инициализация службы захвата звука и начало записи. • Обсуждение методов записи звука и обратного вызова. 08:31 Разделение ответственности • Исключение службы захвата из модели основного вида. • Привязка сервиса к модели представления. 10:04 Загрузка настроек и инициализация • Асинхронная загрузка данных и настройка служб. • Динамическое обновление размеров элементов управления. 12:05 Завершение инициализации • Начало захвата звука после инициализации. • Автоматическое начало записи. • Предоставление опций «запись» и «пауза». 13:11 Импорт файлов и настройка громкости • Необходимо импортировать отсутствующие файлы. • Нужно настроить громкость и обеспечить обратный вызов для отправки данных в viewmodel. 13:51 Раскрытие функций и документация • Раскрываются публичные функции «старт» и «стоп». • Используются комментарии для документации, наследуемые от интерфейса. 14:45 Обработка аудиоданных • Создаётся обработчик для возврата изменённых звуков. • Добавляется класс «audio chunk data» для хранения информации об одном фрагменте аудио. 15:53 Анализ громкости • Добавляются кратковременные люфты и интегрированная громкость. • Используется класс «запись» для хранения общедоступных свойств. 18:07 Организация обратного вызова • Организуется обратный вызов для получения следующего фрагмента аудиоданных. • Переименовывается метод «захваченный фрагмент аудио». 19:17 Вычисление значений • Вычисляется полезная информация из звукового фрагмента. • Создаётся новый звуковой фрагмент для обработки данных. 23:08 Привязка данных к интерфейсу • Данные по фрагменту аудио привязываются к пользовательскому интерфейсу. • Привязываются кратковременная громкость и другие параметры. 24:29 Тестирование и корректировка • Тестируется работа системы. • Внедряется базовая служба захвата звука. • Проверяется правильность привязки свойств. 26:30 Визуализация данных • Данные визуализируются на экране. • Лофты умножаются на 0,9 для отображения полезных значений. • Планируется исправление значений при написании аудиокода. 27:15 Обновление пользовательского интерфейса • При запуске программы пользовательский интерфейс обновляется и меняется. • Все элементы интерфейса, кроме громкости, работают корректно. • Наблюдается медленное снижение реальных значений. 27:41 Настройка стрелки громкости • Необходимо сделать так, чтобы стрелка громкости двигалась плавно. • Планируется установить измеритель громкости на панели, которая будет двигаться вверх и вниз вместе с реальными значениями. • Стрелка будет двигаться как упругая пружина с задержкой, создавая эффект S-образной кривой. 28:37 Структура сервиса и модели представления • Важно структурировать сервис и модель представления для чистоты представления. • Не стоит тратить время на создание идеального интерфейса, если он не будет использоваться. • Сначала нужно убедиться, что интерфейс нравится, а потом совершенствовать его. • Не начинайте с идеально доработанного кода, чтобы не пришлось всё переделывать.00:00 Введение и цель 01:04 Начало разработки 01:34 Настройка библиотек 03:27 Использование ChatGPT 04:49 Проблемы с кодом 08:36 Анализ ошибок 10:16 Переход к образцам 11:54 Разработка собственного решения 13:20 Инициализация аудиозаписи 14:40 Настройка параметров записи 15:22 Обработка данных и обратные вызовы 16:54 Управление записью 17:30 Делегаты и события 19:27 Создание экземпляра приложения 20:13 Запись WAV-файлов 21:30 Проверка устройств 25:28 Инициализация и проблемы 26:38 Создание сервиса записи звука 27:12 Управление сервисом 27:36 Инициализация и захват звука 28:06 Работа с буфером 28:49 Запись звука в файл 30:08 Реализация таймера 31:32 Проверка работы 32:29 Исправление ошибок 34:16 Анализ аудиоданных 35:12 Визуализация данных 37:01 Заключение00:00 Введение и цель • Необходимо найти способ записывать и передавать аудио в потоковом режиме с Mac, Windows и Linux. • Если не удастся найти готовое решение, придётся создать код самостоятельно. • Цель — найти код, который позволит передавать аудио с любого подключённого микрофона. 00:31 Начало исследования • Проект использует Avalonia и .NET Core для получения звука. • Начинаем поиск решений через Google, ищем статьи и пакеты NuGet. • Планируем экспериментировать с различными пакетами. 01:45 Обзор OpenTK .NET • OpenTK использует классы захвата звука для сбора данных с микрофона на разных платформах. • Поддерживает Windows, Linux и Mac. • Имеет высокую стабильность и поддержку. 02:42 Анализ других вариантов • Рассматриваем пример с процентной шкалой уровня звука. • Оцениваем документацию и активность разработки. • Сравниваем OpenTK с другими вариантами. 06:31 Проблемы с Naudio • Naudio поддерживает только Windows, что ограничивает его использование. • Для Mac потребуется другое решение. 07:52 Попытка использования SoundLib • Пытаемся использовать оболочку C# для кроссплатформенного аудио SoundLib. • Возникают проблемы с одобрением файлов на Mac. • Исследуем ошибки и пытаемся их исправить. 10:11 Отладка кода • Удаляем устройство вывода, чтобы проверить работу кода. • Обнаруживаем ошибку ввода-вывода звука. • Продолжаем отладку, проверяя использование кольцевого буфера. 11:00 Создание кольцевого буфера • Создание кольцевого буфера для хранения данных. • Длительность буфера вызова составляет 30 секунд. • Переписывание кода под конкретные нужды. 11:16 Работа с указателями и байтами • Считывание свободных байтов из указателя записи. • Использование расширенного указателя чтения для подсчёта байтов в кадре. • Начало чтения с определённого количества кадров. 12:06 Проблемы с задержкой микрофона • Упоминание проблемы с задержкой микрофона. • Серверная часть равна нулю, что указывает на отсутствие проблем. 12:46 Выбор устройства по умолчанию • Если значение device равно null, выбирается устройство по умолчанию. • Регистрация выходных данных при нулевом результате. 13:18 Проверка совместимости частоты дискретизации • Проверка совместимости частоты дискретизации устройства вывода с форматом. • Устройство ввода поддерживает формат и частоту дискретизации. 14:04 Настройка входного потока • Необходимость включения устройства вывода для выбора макета. • Использование одного и того же устройства для входа и выхода. 15:30 Расчёт частоты дискретизации и задержки • Точный расчёт частоты дискретизации, количества байт на кадр и времени задержки. • Сохранение данных в буфере без его создания. 18:43 Чтение данных из потока • Получение каналов, считывание количества байт на выборку. • Копирование данных из потока в буфер памяти. 20:11 Анализ полученных данных • Проверка формата и частоты дискретизации данных. • Анализ необработанного звука с нулями и единицами. 21:12 Исправление ошибок чтения • Удаление цикла for для буфера. • Проверка работы системы после исправления. 22:12 Вывод данных на консоль • Вывод данных на консоль для анализа. • Суммирование байтов и вывод их на экран. 23:28 Анализ значений данных • Анализ значений данных, полученных из аудиозаписи. • Понимание, что данные не обязательно связаны с объёмом. 23:54 Запись звука в код • Запись звука легко включается в код. • Для записи звука требуется небольшой фрагмент кода и обратный вызов. • Можно передавать данные в потоковом режиме вместо записи четырёх байтов. 24:46 Тестирование и интеграция • Автор предлагает протестировать запись звука на разных микрофонах. • Планируется интеграция записи в чтение аудиоданных и их визуальную обработку. • Если тест пройдёт успешно, интеграция будет продолжена.010. Пользовательский интерфейс Avalonia - Всплывающее управление 00:00 Введение в всплывающее окно • Обсуждение специфичности всплывающего окна для исходного кода и SAML. • Упоминание о свойствах всплывающего элемента управления: «открыто», «размещение», «цель». • Решение проверить использование всплывающего элемента управления на YouTube. 01:00 Тестирование всплывающего окна • Вставка всплывающего окна в кнопку и проверка его работы. • Обнаружение проблем: отсутствие анимации и неправильная позиция. 01:35 Настройка свойств всплывающего окна • Прикрепление всплывающего окна к элементам управления без встроенной поддержки. • Эксперименты с выравниванием нижнего и верхнего краёв по левому краю. 02:31 Проблемы с позиционированием • Трудности с настройкой направления открытия всплывающего окна. • Попытка выровнять верхний край по левому краю для вертикального открытия. 04:01 Стилизация всплывающего окна • Начало стилизации всплывающего окна с помощью селектора. • Удаление предустановленных стилей и настройка прозрачности, отступов и полей. 06:06 Анализ предопределённых границ • Обнаружение предопределённых верхних и нижних границ всплывающего окна. • Попытка создать пользовательский стиль с помощью прямоугольника. 07:03 Переопределение всплывающего окна • Просмотр исходного кода всплывающего окна на GitHub. • Переопределение всплывающего презентатора и поиск заранее подготовленных отступов. 09:16 Удаление отступов • Использование отрицательных отступов для удаления запаса всплывающего окна. • Настройка верхних и нижних границ на прозрачные для создания бесшовного стиля. 10:12 Создание пользовательского всплывающего окна • Создание копии стандартного всплывающего окна для настройки вертикального смещения. • Копирование содержимого класса и настройка смещения по вертикали. 12:36 Тестирование смещения • Установка смещения по вертикали для всплывающего окна. • Проверка эффекта изменения положения всплывающего окна. 13:38 Проблемы с всплывающим окном • Всплывающее окно само определяет направление появления. • При нажатии на кнопку вниз возникает странный эффект. • Ошибки из-за проблем с всплывающим окном. 14:37 Анализ кода • Код использует всплывающий класс, который является элементом управления. • При открытии используется всплывающее сообщение с наложением. • Обновление размера, установка дочерних элементов и положения требуют много работы. 15:44 Сложности анимации • Анимация требует времени, а всплывающее окно либо есть, либо нет. • Класс всплывающих окон не поддерживает анимацию и пользовательское позиционирование. • Проблемы с мерцанием и непредсказуемым направлением появления. 16:35 Потенциал и ограничения • Всплывающее окно игнорирует макет и появляется вне заданного положения. • Отсутствие анимации и пользовательского позиционирования. • Большой объём работы для отображения всплывающего окна. 17:15 Планы по улучшению • Создание уникального пользовательского элемента управления для повторного использования. • Запрос функции на GitHub для улучшения всплывающего окна. • Поддержка анимации, вертикального и горизонтального смещения, определённого направления движения. 18:15 Родительский контроль • Использование родительского элемента для определения положения всплывающего окна. • Динамическое создание элемента управления с привязкой к сетке. • Привязка свойств к элементу управления. 20:32 Прикрепление к кнопке • Размещение элемента управления внутри кнопки как прикреплённого свойства. • Определение родителя верхнего уровня для добавления всплывающего окна. • Имитация поведения базового прикреплённого всплывающего экрана. 23:35 Создание нового стиля • Замена элемента управления на пользовательский. • Создание нового стиля «анимированное всплывающее окно». • Добавление стиля в приложение и тестирование на главном экране. 25:26 Работа с шаблоном и содержимым • Использование шаблона для управления содержимым. • Необходимость задания имени для корректной работы. • Настройка всплывающего окна с шаблонным элементом управления по умолчанию. 26:11 Проблемы с границей и выбор типа элемента • Проблема с предопределённой границей, которая мешает правильной работе. • Выбор между различными типами элементов управления: элемент ввода, макет, визуальный элемент. • Создание нового типа элемента управления и его скрытие по умолчанию. 27:18 Управление контентом • Изменение шаблона управления для свободного размещения контента. • Использование элемента управления контентом для размещения ярлыка с контентом. • Настройка переднего плана для лучшего отображения на чёрном фоне. 28:03 Стилизация и привязка контента • Изменение шаблона управления для передачи фактического контента. • Привязка содержимого к шаблону привязки содержимого. • Добавление кнопки в содержимое элемента управления. 29:28 Определение анимированного всплывающего окна 30:27 Настройка z-индекса 31:57 Стилизация и выравнивание 33:35 Проверка работы и дальнейшие улучшения 36:12 Заключение00:00 Создание расширяемого элемента управления • Обсуждение необходимости поддержки расширяемого элемента управления. • Проблема с текущим всплывающим окном: установка размера один раз и отсутствие его изменения. • Создание расширителя и добавление содержимого. 00:57 Настройка расширителя • Проверка состояния расширителя и присвоение свойства `expanded` значения `true`. • Проблема фиксации высоты при расширении. 01:24 Тестирование расширителя в сетке • Вставка расширителя в рамку и наблюдение за его расширением в сетке. • Ожидание поведения, аналогичного обычному всплывающему элементу управления. 02:28 Анимация элемента управления • Объяснение процесса анимации элемента управления до и обратно. • Установка ширины и высоты для активации анимации. 04:00 Проблемы с контрольными точками • Трудности с получением контрольных точек при отладке. • Решение проблемы путём установки ширины и высоты в `NaN`. 06:10 Обновление желаемого размера • Определение момента для обновления желаемого размера при закрытии панели управления. • Использование систем защиты от сбоев для предотвращения дублирования кода. 10:04 Финальная настройка анимации • Обновление желаемого размера на основе текущего размера элемента управления. • Проверка завершения анимации перед обновлением размера. 12:14 Тестирование и завершение • Тестирование анимации и подтверждение её гладкости. • Подтверждение надёжной поддержки расширяемого всплывающего окна. 12:58 Добавление свойства непрозрачности анимации • Создание логического свойства непрозрачности анимации с значением `true` по умолчанию. 13:23 Анимация непрозрачности • Копируем и вставляем код для анимации непрозрачности наложения. • Устанавливаем анимацию непрозрачности на основе свойства. • Сохраняем исходную непрозрачность для элемента управления. 13:57 Проверка анимации • Проверяем, что при полном открытии непрозрачность сбрасывается до исходного значения. • Учитываем, что при короткой анимации непрозрачность может быть ниже 100%. 14:20 Создание расширителя анимации • Создаём модель представления с списком списков для четырёх расширителей. • Каждый элемент списка будет иметь заголовок и подконтент. • Привязываем модель представления к пользовательскому интерфейсу. • В пользовательском интерфейсе появится список с расширителями, привязанными к другому списку. 14:20 Итоги • Поддерживаем расширение и сворачивание с помощью контроля. • Добавляем приятную затухающую непрозрачность.00:00 Начало работы со стрелкой • Обсуждение рисования стрелки-индикатора. • Планирование анимации движения стрелки вверх и вниз. • Подготовка к работе с реальным звуком. 00:50 Создание контура стрелки • Замена прямоугольника контуром для рисования стрелки. • Заполнение контура белым цветом и добавление данных. • Начало рисования стрелки с точек x и y. 02:07 Настройка размера стрелки • Увеличение ширины стрелки до 20 раз. • Сравнение с оригинальной стрелкой измерителя громкости Yulin. • Корректировка размеров стрелки. 04:12 Привязка стрелки к объекту недвижимости • Установка позиции стрелки на холсте. • Создание наблюдаемого свойства «положение в процентах объёма». • Привязка стрелки к объекту недвижимости. 05:41 Анимация стрелки • Разработка функции инициализации и таймера. • Установка интервала таймера на 60 секунд. • Тестирование анимации движения стрелки. 08:16 Реализация синусоидальной волны • Замедление таймера на 5 секунд для более плавной анимации. • Вычисление синусоидальной волны на основе тика таймера. • Умножение синусоидальной волны на масштаб 100. 10:30 Настройка частоты кадров • Разделение тика на число с плавающей запятой для сохранения точности. • Тестирование анимации на 120 кадрах в секунду. • Возвращение к 60 кадрам в секунду и дальнейшее замедление процесса. 11:28 Определение масштаба • Вместо случайного масштабирования предлагается определить масштаб на основе высоты холста. • Используется код анимированных всплывающих окон для определения размера объектов. • При рендеринге запускается таймер для обновления свойства размера. 12:28 Использование таймера • Таймер определения размера используется для получения желаемого размера за вычетом границ сетки. • Таймер тайм-аута определяет завершение автоматического определения размера при масштабировании. • Обновление размера происходит, когда изображение перестаёт двигаться на 100 миллисекунд. 13:45 Создание универсального метода • В конструкторе главного представления создаётся новый таймер. • Метод обновления размеров становится универсальным и может использоваться в разных местах. 15:09 Настройка размера контейнера • Устанавливается процент громкости и размер контейнера для объёма. • Размер контейнера устанавливается на 500, но требуется настройка на фактический размер холста. 18:27 Проблемы с размером • Желаемый размер контейнера для объёма не работает должным образом. • Границы контейнера имеют значение, но расчёты размера не учитываются. 19:36 Коррекция размера • Размер контейнера сокращается вдвое для учёта синусоидальной волны. • Возможность указания размера от 0 до 100 достигается через преобразователь значений. 20:31 Настройка диапазона • Настраиваются минимальные и максимальные значения для масштабируемой стрелки. • Стрелка визуально масштабируется в точном диапазоне. • Планируется добавление реакции стрелки на реальный звук для более реалистичного отображения уровня громкости.00:00 Поддержка закрытия всплывающего окна • Необходимо поддержать закрытие всплывающего окна, которое сейчас можно только открыть. • Для этого создаём новый элемент управления underlay внутри анимированного всплывающего окна. 00:37 Создание элемента управления underlay • В конструкторе создаём новый элемент управления underlay. • Устанавливаем его границу и делаем фон прозрачным, сначала делая его красным для видимости. 01:27 Настройка индекса z и события нажатия мыши • Изменяем индекс z на 9 для прозрачности. • Добавляем событие нажатия указателя мыши для закрытия всплывающего окна. 02:32 Имитация поведения закрытия • Устанавливаем диапазон строк и столбцов для имитации поведения закрытия. • Определяем момент внедрения элемента управления underlay при полном открытии контроллера. 03:44 Перенос кода в новый метод • Переносим код в новый метод для завершения анимации открытия и закрытия. • Проверяем работу метода через точки останова. 06:10 Вставка и удаление подложки • Вставляем подложку при полном открытии контроллера, если родительским элементом является сетка. • Удаляем подложку при закрытии, проверяя наличие в сетке. 08:18 Настройка свойств сетки • Устанавливаем прикреплённые свойства для сетки, диапазона строк и столбцов. • Проверяем наличие определений строк и столбцов в сетке. 11:18 Анимация непрозрачности • Настраиваем анимацию непрозрачности подложки для естественного исчезновения. • Уменьшаем непрозрачность в начале анимации открытия. 14:24 Завершение настройки • Переносим настройки непрозрачности в команду «Открыть». • Проверяем работу анимации в конструкторе. 15:07 Настройка переходов • Настраиваем двойной переход для непрозрачности. • Проверяем работу переходов в фоновом режиме. 16:13 Анимация непрозрачности • Непрозрачность не устанавливается напрямую, а анимируется вместе с элементом управления. • Используется таймер анимации и бегущая строка. • Подложка анимируется для открывания и закрывания элемента управления. 17:04 Создание анимации подложки • Подложка создаётся с равными значениями. • Процент анимации рассчитывается на основе размера. • Полученный процент умножается на 0.2 для желаемого объёма перехода. 17:29 Эффект анимации • Один цикл анимации создаёт плавный переход фона. • Возможность увеличения непрозрачности фона до определённого свойства. 17:48 Свойства анимации • Используются свойства open и время анимации. • Непрозрачность подложки задаётся двойным значением. • По умолчанию непрозрачность равна 0.2. 18:46 Обновление кода • Обновление кода для добавления подложки или пастообразного слоя. • Возможность полного покрытия или установки определённого значения непрозрачности. 20:03 Поддержка промежуточных переходов • Поддержка промежуточных переходов при открытии и закрытии окна. • Возможность закрытия окна на полпути открытия. 20:11 Следующий шаг • Добавление контента внутри элемента управления. • Создание расширяемого и сворачиваемого элемента управления. • Настройка переменной ширины и высоты всплывающих окон.00:00 Исправление ошибок меню • Меню не работает, нужно исправить ошибку. • Уменьшить размер заголовков и разместить меню так, чтобы оно выглядело как другое меню. • Выяснить причину сбоя при переплете. 01:00 Настройка открытия меню • Сделать меню открытым по умолчанию. • Установить значение «список открыт» равным true для постоянного отображения меню в модели просмотра. 02:10 Работа с диспетчером • Добавить диспетчер для безопасного изменения пользовательского интерфейса. • Переместить сетку и базовый элемент управления в поток диспетчера. • Убедиться, что анимационная галочка остаётся в потоке пользовательского интерфейса. 04:11 Стилизация интерфейса • Стилизовать интерфейс для соответствия измерителю громкости Julian. • Изменить заголовок, сделав его тонким и красивым. • Изучить шаблон управления для расширителя. 08:20 Работа с темами управления • Использовать темы управления как ресурсы для стилизации. • Создать новый шаблон управления для маленького расширителя. • Применить тему управления к настоящему расширителю. 11:30 Настройка кнопки переключения • Сделать фон кнопки переключения прозрачным. • Скопировать шаблон исходной кнопки переключения и добавить его к своей кнопке. • Переместить стрелку на правую сторону кнопки. 12:59 Завершение настройки • Убрать отступы над стрелкой. • Сделать стрелку на всю высоту. • Добавить содержимое обратно в заголовок, убедившись, что он свернут как можно тоньше. 13:41 Удаление синей рамки и замена презентатора контента • Удаление синей рамки связано с классом Expander CS, который читает название и применяет шаблон. • Замена презентатора контента на элемент управления контентом, чтобы лишить Expander возможности управлять шаблоном. 14:27 Перемещение содержимого • Перемещение содержимого вверх по порядку для правильного отображения. 14:35 Создание стрелки с помощью потоковой геометрии • Объяснение синтаксиса пути и команд для создания стрелки: «м» открывает путь, «l» создаёт линейную команду, «v» — вертикальную линию, «c» — кривую. • Пример создания стрелки с перемещением на ноль, затем на одну и другую линию, и выполнением команды «Закрыть». 16:03 Настройка обводки и завершение фигуры • Изменение обводки фильтра для отображения контура стрелки. • Удаление команды «z» для незавершённой фигуры. 16:54 Перерисовка стрелки • Перерисовка стрелки с нуля, начиная с перемещения курсора на 12 градусов вправо. • Корректировка углов для устранения лишнего пространства. 18:55 Добавление линии границы • Вставка панели стека и добавление прямоугольника для заливки в нижней части расширителей. • Настройка высоты прямоугольника и отступов для соответствия оригиналу. 20:22 Стилизация кнопок и заголовков • Стилизация кнопок и заголовков, добавление эффектов наведения курсора. 20:55 Вращение стрелки • Использование рендеринг-трансформации для вращения стрелки при расширении и сжатии. • Привязка к свойству toggle buttons is checked и создание конвертера значений для преобразования логического значения в рендеринг-трансформацию. 22:09 Реализация конвертера значений • Создание класса checked to rotation converter для преобразования логического значения в угол в градусах. • Обработка недопустимых значений и возврат уведомления о привязке. 24:10 Завершение работы • Добавление ресурса преобразователя значений в пользовательский элемент управления. • Проверка работы стрелки, которая вращается в зависимости от состояния элемента управления. • Подведение итогов и завершение занятия.00:00 Создание модели основного представления • Создание модели основного представления с сгруппированной коллекцией в раскрывающемся списке. • Переход к XAML-файлу главного окна и редактирование расширителя для более широкого обзора. • Использование границы всплывающего окна и коллекции из коллекции для организации данных. 00:56 Привязка элемента управления • Привязка элемента управления first items к списку конфигураций каналов. • Создание шаблона элемента управления items для указания внешнего вида каждого элемента. 01:29 Настройка пользовательского интерфейса • Настройка шаблона данных для динамического отображения элементов. • Привязка метки к ключу IEnumerable конфигураций каналов. 02:39 Работа с расширителем • Вставка расширителя обратно в XAML-файл. • Добавление сетки и метки ключа для организации элементов. 03:56 Привязка содержимого выпадающего списка • Добавление элемента управления items и настройка его шаблона. • Проверка работы привязки и автоматическое отображение элементов. 05:14 Преобразование элементов в кнопки • Замена меток на кнопки для обработки нажатий. • Привязка кнопок к команде для выполнения действий. 06:42 Передача родительского элемента • Передача родительского элемента дочернему через viewmodel. • Использование инструментария MVVM для определения нажатого элемента. 07:11 Привязка к команде • Привязка кнопки к команде с передачей элемента конфигурации канала. • Проверка работы команды через точку останова в viewmodel. 10:59 Завершение привязки • Настройка выбранной конфигурации при нажатии кнопки. • Привязка анимированных всплывающих окон к открытым спискам настроек канала. 11:42 Проверка состояния списка • Проверка открытия списка настроек канала через привязку к его состоянию. 12:07 Проблема с привязкой • Значение переменной не меняется при открытии меню. • Привязка к кнопке и тексту работает, но всплывающее меню не функционирует. 12:53 Анализ проблемы • Проблема связана с анимированным всплывающим окном и односторонней привязкой. • Необходимо изменить привязку на двустороннюю. 13:54 Решение проблемы с рендерингом • Рендеринг запускает бесконечный цикл из-за изменений в пользовательском интерфейсе. • Переопределение рендеринга в модели представления и анимированном всплывающем окне. • Передача изменений в другой поток диспетчера для предотвращения бесконечного цикла. 15:09 Проверка работы привязки • Двусторонняя привязка работает при открытии меню, но не при закрытии. • Ошибка может быть в анимированном всплывающем окне. 16:13 Анализ работы анимации • При закрытии меню запускается анимация обновления, но значение «открыто» остаётся истинным. • Удаление анимации из вызовов «начать открывать» и «закрыть». 17:07 Завершение работы • Обновление анимации и вызов события изменения свойства. • Кнопка теперь закрывает меню правильно. 18:06 Привязка к тексту • Содержимое привязано к тексту кнопки настройки канала, который привязан к короткому тексту выбранных каналов. • Планируется форматирование сетки для улучшения внешнего вида. • Самая сложная привязка решена, остальные будут проще.00:00 Введение в viewmodels и сервисы • Объяснение необходимости использования viewmodels, сервисов и привязок. • Создание viewmodel для меню с сгруппированным контентом. • Модель представления должна содержать строку для отображения и быть связана с выбором в раскрывающемся списке. 00:58 Разделение обязанностей с помощью сервисов • Viewmodels не должны собирать информацию, это задача сервисов. • Создание папки «службы» и монолитного сервиса «i audio интерфейсная служба». • Сервис будет обрабатывать получение данных, необходимых для приложения. 01:57 Реализация метода получения конфигураций каналов • Определение метода «get channel configuration» для получения списка конфигураций каналов. • Метод будет асинхронным, возможно, извлекающим данные из базы данных. 02:49 Создание элемента конфигурации канала • Создание папки «модели данных» и элемента «channel configuration item». • Элемент должен быть неизменяемым для предотвращения изменений информации. 03:52 Решение проблемы с компилятором • Описание ошибки в Rider при использовании ключевого слова `cp nines init`. • Временное решение проблемы путём добавления внешнего класса. 07:23 Использование record для неизменяемых объектов • Объяснение использования record для создания неизменяемых классов. • Record позволяет эффективно компилировать классы со свойствами, доступными только для чтения. 09:13 Создание фиктивного сервиса аудио-интерфейса • Создание фиктивного сервиса аудио-интерфейса для разработки пользовательского интерфейса. • Возможность замены фиктивного сервиса реальным при запуске приложения. 10:11 Имитация данных конфигурации канала • Создание нового элемента конфигурации канала с группой, текстом и коротким текстом. • Пример имитации данных: группа «моно-стерео», длинный текст и короткий текст. • Использование строчных букв для групп и заглавных для пользовательского интерфейса. 11:37 Введение в проект • Обсуждение фиктивной информации и группировки данных по строке group. • Планирование внедрения сервиса в viewmodel. • Объяснение работы общедоступных свойств через observable. 12:39 Конструктор и внедрение зависимостей • Создание конструктора для внедрения службы аудио-интерфейса. • Определение частных свойств для хранения зависимостей. • Пример инициализации зависимостей в разделе «Инициализация фреймворка». 15:31 Проблемы с конструктором по умолчанию • Проблема отсутствия конструктора по умолчанию и её решение путём создания дополнительного конструктора. • Замена двух экземпляров для корректной работы приложения. • Проверка работы конструктора в режиме разработки. 17:41 Получение списка конфигураций • Использование observable сгруппированной коллекции для работы со списком конфигураций. • Формирование групп по заголовкам и элементам конфигурации. • Инициализация данных асинхронно при готовности приложения. 19:12 Именование свойств и предупреждения • Решение проблем с предупреждениями о неправильном именовании свойств. • Применение подчёркивания для наблюдаемых свойств. • Устранение предупреждений о несоответствии правилам именования. 20:10 Выбор и отображение выбранного элемента • Сохранение выбранного элемента и получение текста для кнопки. • Создание наблюдаемого свойства для выбранного элемента. • Обновление пользовательского интерфейса при изменении выбранного элемента. 22:45 Команда для выбора элемента • Определение команды для обработки нажатия на элемент. • Запуск события уведомления при изменении выбранного канала. • Обновление пользовательского интерфейса при выборе элемента. 23:24 Обработка нажатия пункта меню • Ввод пункта из пользовательского интерфейса. • Обновление выбранного элемента. • Закрытие меню при изменении свойства «открыто». • Обновление кнопки с учётом выбранного элемента. 24:16 Добавление команды «ретранслировать» • Превращение команды в реальную команду. 24:24 Загрузка информации • Использование общедоступных методов для загрузки информации. • Преобразование методов в команды для асинхронной ретрансляции. 25:34 Преобразование макета • Преобразование макета в наблюдаемую сгруппированную коллекцию. • Группировка конфигураций каналов по элементу и свойствам. 26:30 Запуск загрузки настроек • Запуск загрузки настроек при загрузке представления. • Инициализация контекста данных и команды «Загрузить настройки». 27:34 Привязка текста кнопок • Привязка текста кнопок к выбранному свойству. • Отображение сообщения «выбрать канал». 28:32 Ошибка с нулевой ссылкой • Возникновение исключения с нулевой ссылкой. • Проверка контекста данных и команды «Загрузить настройки». 29:37 Исправление ошибки • Завершение инициализации фреймворка. • Проверка жизненного цикла приложения. 30:20 Проверка контекста данных • Проверка заполнения контекста данных информацией. • Исправление неправильно сгруппированных данных. 31:39 Обновление приложения • Обработка внедрения зависимостей. • Привязка списка к пользовательскому интерфейсу. • Заполнение интерфейса реальными данными. 32:20 Заключение