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