Как стать автором
Обновить

Fancy Widgets — виджеты рабочего стола на AvaloniaUI

Уровень сложностиПростой
Время на прочтение5 мин
Количество просмотров4.5K

Привет, Хабр!

Около трёх месяцев назад, я и мой друг - начинающие .NET разработчики, решили разработать свои виджеты на рабочий стол Windows, так как официальных нормальных виджетов нет (те что в Windows 11 не считаются). Недавно мы выпустили наш проект в релиз, пока что есть 2 виджета (Погода и Заметки), но вскоре их может быть больше! Проект называется Fancy Widgets и мы хотим поделиться им с вами. Вы можете попробовать наши виджеты, скачав их с нашего сайта fancy-widgets.onrender.com. Это наш pet-проект и поэтому он ни на что не претендует, мы просто делали его для себя и для удовольствия. Но мы будем рады услышать ваше мнение и предложения по улучшению нашего продукта. Вы можете оставить свои комментарии под этой статьей или написать нам на нашу почту fancy.widgets.help@gmail.com. Цель этой статьи - вкратце рассказать о нашем проекте и о сложностях, которые возникли у нас при разработке. Мы надеемся, что вы найдете нашу статью интересной и полезной. Приятного чтения! ?

Fancy Widgets
Fancy Widgets

Цели проекта

Наша цель была создать красивые, функциональные и настраиваемые виджеты, которые могли бы показывать различную полезную информацию, возможность легкой установки и использования, а также низкое потребление ресурсов компьютера. Также должна быть возможность разработки виджетов сторонними людьми при помощи нашей библиотеки (вот она). Позже на нашем сайте появится документация к библиотеке.

Реализация проекта

Для реализации нашего проекта мы выбрали AvaloniaUI - современный кроссплатформенный фреймворк для создания графических пользовательских интерфейсов на С#. Мы выбрали этот фреймворк, потому что он имеет ряд преимуществ, таких как:

  • Популярность и активность сообщества. AvaloniaUI является одним из самых популярных и развивающихся фреймворков для десктоп разработки на C#, что обеспечивает ему хорошую документацию, множество примеров, статей и видеоуроков.

  • Простота и гибкость.

  • Производительность и качество. AvaloniaUI использует Skia - библиотеку для рендеринга графики, которая обеспечивает высокую скорость и качество отображения графических элементов.

До начала работы над Fancy Widgets у нас не было большого опыта в десктоп разработке (мы только пробовали MAUI и WPF), поэтому нам нужен был фреймворк, который был бы несложным в изучении и использовании, но при этом достаточно мощным и функциональным. Мы рассмотрели несколько альтернативных фреймворков, но остановили свой выбор на AvaloniaUI по следующим причинам:

  • MAUI нам показался не очень стабильным и “тяжелым” фреймворком, который требует много ресурсов и времени для настройки и запуска приложений, что не очень подходит нам. (Проблема ещё в том, что необходимо устанавливать множество рабочих нагрузок, которые весят немало).

  • WPF мы отбросили просто потому что он устарел.

Fancy Widgets делится на 2 отдельных приложения: главное приложение, в котором мы видим все добавленные нами виджеты, которые мы можем включить/выключить (Виджеты скачиваются с нашего сайта и ложатся по пути C:\Users\USERNAME\Documents\Widgets). и служба, контролирующая запуск/закрытие виджетов. Эти 2 приложения связаны между собой посредством TCP соединения (этот способ показался нам наиболее простым и быстрым для обеспечения межпроцессного взаимодействия).

Что было сложно?

Одна из сложностей была связана с освоением XAML - языка разметки, который используется для создания пользовательских интерфейсов в AvaloniaUI. Поскольку мы привыкли к HTML и CSS, нам было не очень удобно работать с XAML, который имеет другой синтаксис и логику. Нам пришлось изучить, как писать стили, темы, шаблоны, привязки данных и другие элементы XAML. Но со временем мы смогли адаптироваться к этому языку и создать красивое и функциональное приложение для управления виджетами, а также сами виджеты.

Главной сложностью при разработке Fancy Widgets было обеспечение "нативного" опыта использования виджетов на Windows. Виджеты не должны показываться среди окон при нажатии Alt+Tab и не должны сворачиваться на Win+D. Для этого нам пришлось использовать вызов функций WinAPI из C# кода (P/Invoke). Это было довольно сложно и рискованно, так как использование WinAPI может привести к непредсказуемым результатам и ошибкам (например, сворачиванию панели задач или другим забавным багам). Но после многих экспериментов и тестов мы смогли подобрать нужные функции и последовательность их вызовов (да, это влияло на результат) и в итоге наши виджеты стали вести себя так, как мы хотели.

Еще одна сложность была связана с управлением памятью и производительностью нашего приложения. Мы столкнулись с проблемой утечек памяти из-за объектов типа Bitmap, которые используются для отображения графических элементов в наших виджетах. Оказалось, что эти объекты попадают в Large Object Heap (LOH) - специальную область памяти для больших объектов, которая не очищается сборщиком мусора так часто, как обычная область памяти. Это приводило к тому, что наше приложение занимало все больше и больше памяти и становилось медленнее. Мы решили эту проблему в основном использованием метода GC.Collect(), который принудительно запускает сборку мусора и освобождает память от неиспользуемых объектов.

Но есть одна нерешенная проблема - скорость работы и потребление ОЗУ тем самым Bitmap. При добавлении картинки в виджет или в главное приложение для управления виджета, происходит сильное снижение производительности приложения. Что с этим делать мы не знаем, поэтому если есть идеи, пожалуйста напишите в комментариях под статьёй.

Кастомизация виджетов

При разработке виджета, разработчик должен предусмотреть, какие части виджета можно будет кастомизировать и с помощью нашей библиотеки реализовать изменение этих параметров в окне настроек виджета.

Пример кастомизации виджета погоды
Пример кастомизации виджета погоды

Конечно, есть возможность изменить размер виджета. Для этого нужно зажать Ctrl и нажать правой кнопкой мыши по виджету и в контекстном меню выбрать "Edit". После изменения размеров, в контекстном меню нажмите "Disable Editing".

Изменение размера виджета
Изменение размера виджета

Таким образом, мы предоставляем пользователям широкие возможности для кастомизации наших виджетов. Мы считаем, что это делает наш проект более интересным и полезным.

Заключение

В этой статье я поделился с вами нашим проектом Fancy Widgets. Мы рассказали вам, зачем мы решили создать виджеты для рабочего стола Windows, какие технологии мы использовали, с какими проблемами мы столкнулись и какие виджеты мы сделали. Мы надеемся, что вы получили удовольствие от чтения нашей статьи и узнали что-то новое и интересное.

Мы также надеемся, что вы попробуете наши виджеты на своем компьютере. Вы можете скачать наши виджеты с нашего сайта. Это абсолютно бесплатно и безопасно. Мы будем очень рады, если вы захотите предложить свои идеи для новых виджетов.

Мы очень ценим ваше мнение о нашем проекте. Пожалуйста, напишите нам свои отзывы, комментарии, пожелания или вопросы под этой статьей или на нашу почту fancy.widgets.help@gmail.com. Мы будем рады общению с вами и ответим на все ваши сообщения.

Спасибо за то, что прочитали нашу статью и заинтересовались нашим проектом. Мы желаем вам всего хорошего и удачи! ?

Теги:
Хабы:
Всего голосов 4: ↑4 и ↓0+4
Комментарии10

Публикации

Истории

Работа

Ближайшие события

7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань