Avalonia#

Сама по себе платформа .NET покрывает и поддерживает только модель консольных приложений и приложений ASP.NET Core (веб-приложения). Реализация WPF (Windows Presentation Foundation) отсутствует для платформы Linux.

Avalonia — это открытый кроссплатформенный UI-фреймворк, который позволяет создавать десктопные приложения с использованием .NET для Windows, macOS, Linux, iOS, Android и WebAssembly. Avalonia использует XAML для разметки интерфейса, имеет гибкую систему стилей и поддержку MVVM, что способствует прозрачности архитектуры приложений.

Рекомендуется использовать данный фреймворк для разработки десктопных приложений на C#. Для перехода с WPF на Avalonia следует ознакомиться с документацией Avalonia.

Основные пакеты#

Пакет

Версия

Репозиторий

Описание

dotnet-sdk-8.0

8.0.100-1astra~1.8.0+b2

extended

Комплект разработки ПО на .NET 8.0

Avalonia

11.2.1

microsoft

Основной пакет Avalonia UI

Avalonia.Desktop

11.2.1

microsoft

Пакет для создания настольных приложений

Для установки основных пакетов необходимо выполнить следующие команды в папке с проектом:

dotnet add package Avalonia
dotnet add package Avalonia.Desktop

Примечание

Альтернативный способ установки основных пакетов описан в пункте Сборка и запуск простого приложения Avalonia. После установки пакета шаблонов Avalonia.Templates и создания шаблонного проекта avalonia.app в файле проекта *.csproj будут указаны необходимые зависимости. При выполнении команды «dotnet restore» все требуемые пакеты будут установлены.

Дополнительные пакеты (рекомендуемые среды разработки для Astra Linux Special Edition)#

Пакет

Версия

Репозиторий

Описание

Visual Studio Code

1.95.3

microsoft

Редактор исходного кода

JetBrains Rider

2024.3.4

jetbrains

IDE для разработки на платформе .NET

Рекомендуемые расширения для IDE#

Для удобства создания интерфейсов можно установить следующие расширения:

  • при разработке в Rider рекомендуется установить плагин AvaloniaRider, который позволяет отображать предварительный просмотр XAML-файлов в режиме реального времени;

  • при разработке в Visual Studio Code рекомендуется установить плагин OpenSilver 3.1 — встраиваемый Drag-and-Drop дизайнер XAML-файлов. Подробнее о разработке с OpenSilver.

Основные элементы Avalonia#

Виджеты (Widgets):

Window: Окно.

Label: Текстовая метка.

Button: Кнопка.

TextBox: Текстовое поле (однострочное или многострочное).

ComboBox: Выпадающий список.

Slider: Ползунок (шкала).

ListBox: Список.

ProgressBar: Индикатор прогресса.

RadioButton: Переключатель.

ScrollViewer: Прокрутка.

Image: Изображение.

Методы размещения виджетов:

Grid: размещает элементы по сетке.

StackPanel: располагает элементы в одном столбце/строке.

WrapPanel: располагает элементы в строках и автоматически переносит их на следующую строку, если они не помещаются.

DockPanels: закрепляет элементы управления к краям контейнера (удобно для учета иерархических интерфейсов).

Canvas: полный контроль над позиционированием элементов.

Сборка и запуск простого приложения Avalonia:#

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

Пункт 1#

  • установить пакет шаблонов проектов Avalonia:

dotnet new install Avalonia.Templates

Пункт 2#

  • создать шаблонный проект:

dotnet new avalonia.app -n MyAvaloniaApp

Выполнение инструкции завершится с ошибкой, поскольку по умолчанию в файле сборки проекта *.csproj указан .Net 9.0. Необходимо заменить его на установленную версию .Net 8.0.

<TargetFramework>net8.0</TargetFramework>

Пункт 3#

  • перейти в каталог созданного проекта и установить необходимые пакеты:

dotnet restore

Пункт 4#

  • перейти в каталог созданного проекта и изменить код файла MainWindow.axaml.cs на приведенный ниже:

using Avalonia.Controls;
using Avalonia.Interactivity;
using System;

namespace MyAvaloniaApp;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void ButtonClickHandler(object sender, RoutedEventArgs e)
    {
        if (MyButton.Content.Equals("Узнать пользователя"))
        {
            var user = Environment.GetEnvironmentVariable("USER");
            ResultText.Text = $"Текущий пользователь - {user}";
            MyButton.Content = "Удалить пользователя";
        }
        else
        {
            ResultText.Text = "";
            MyButton.Content = "Узнать пользователя";
        }

    }
}

Примечание

Объяснение кода

Класс MainWindow наследуется от Window (базовый класс для главного окна). Для кнопки MyButton добавлен обработчик события ButtonClickHandler, который изменяет текст метки.

Пункт 5#

  • изменить код файла MainWindow.axaml на приведенный ниже:

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        x:Class="MyAvaloniaApp.MainWindow"
        Title="MyAvaloniaApp"
        Width="300"
        Height="80">


    <StackPanel Spacing="8">
        <Button Name="MyButton" Content="Узнать пользователя" Click="ButtonClickHandler"
            HorizontalAlignment="Center"/>
        <TextBlock x:Name="ResultText" HorizontalAlignment="Center"/>
    </StackPanel>
</Window>

Примечание

Объяснение кода интерфейса

Виджеты Window, StackPanel, Button и TextBlock являются производными от базового класса AvaloniaObject, позволяя единообразно задавать различные характеристики виджетов. StackPanel наследуется от Panel, что позволяет управлять размещением других элементов. Button и TextBlock позволяют обрабатывать пользовательские взаимодействия и отображать визуальный контент. Для кнопки MyButton добавлен обработчик события ButtonClickHandler, который изменяет текст метки.

Пункт 6#

  • запустить приложение:

dotnet run

Пункт 7#

  • проверить результат, он должен аналогичен представленному ниже:

alt text alt1 text

Сборка и упаковка#

Для публикации avalonia приложений используется стандартные команды упаковки из пакета dotnet-sdk. Создание deb-пакета возможно с помощью утилиты dpkg.

Пункт 1#

  • убедитесь, что ваш проект настроен корректно и все зависимости установлены:

dotnet restore
dotnet build

Пункт 2#

  • получить исполняемый файл приложения можно выполнив команду:

dotnet publish -c Release -o out -r linux-x64 --self-contained
где параметры:
  • -c Release указывает на выполнение сборки в режиме «Release»,

  • -r linux-x64 задает целевую платформу Linux для 64-битных систем,

  • -o out задает директорию публикации out,

  • –self-contained указывает, что все зависимости, включая .NET, будут включены в сборку.

Исполняемый файл приложения — ./out/MyAvaloniaApp.

Пункт 3#

  • в заданной директории out также будет расположен файл MyAvaloniaApp.dll, чтобы собрать только библиотеку dll приложения, нужно выполнить команду:

dotnet publish -c Release -o ./publish --no-self-contained

где параметры –self-contained указывает, что .NET Runtime не будет включен, поэтому запуск сборки возможен только на машинах, где установлен соответствующий .NET Runtime.

Пункт 4#

  • для того, чтобы создать DEB пакет необходимо:

    • установить утилиту dpkg-deb,

    • создать необходимую директорию,

    • скопировать папку out из пункта 2 в эту директорию,

    • создать внутри этой папки файл control и заполнить следующим содержимым:

    Package: myapp
    Version: 1.0
    Section: base
    Priority: optional
    Architecture: amd64
    Depends: .NETCoreApp (>= 3.1)
    Maintainer: Your Name <youremail@example.com>
    Description: Краткое описание приложения.
    
    • создать DEB пакета:

    dpkg-deb --build myapp_1.0