Програми для обліку

Українське програмне забезпечення з відкритим кодом

Gtk4

Дописи

Gtk / Gtk4

02.03.2026 10:15 Gtk4

Розробка програм на C# з графічним інтерфейсом Gtk4 | DropDown - Випадаючий список

Приклад використання віджету DropDown - Випадаючий список

Gtk4 Grid

Для програмування використовую Visual Studio Code.
В програмі Visual Studio Code створюємо новий проект
dotnet new console

Додаємо до проекту пакет GirCore.Gtk
dotnet add package GirCore.Gtk-4.0
dotnet add package GirCore.GObject-2.0.Integration

Запуск програми
dotnet run

Program.cs
using Gtk;

class Program 
{
    static void Main()
    {        
        var app = Application.New("ua.org.accounting.test", Gio.ApplicationFlags.FlagsNone);

        app.OnActivate += (sender, args) =>
        {
            FirstWindow firstWindow = new(app);
            firstWindow.Show();
        };

        app.RunWithSynchronizationContext(null);
    }
}

FirstWindow.cs
using Gtk;
using static Gtk.Orientation;

class FirstWindow : Window
{
    public FirstWindow(Application app) : base()
    {
        Application = app;
        Title = "Window";

        SetDefaultSize(500, 300);

        Box vBox = Box.New(Vertical, 0);
        vBox.MarginTop = vBox.MarginBottom = vBox.MarginStart = vBox.MarginEnd = 10;
        Child = vBox;

        Box hBox = Box.New(Horizontal, 10);
        CreateDropDownPeriod(hBox);

        vBox.Append(hBox);
    }

    void CreateDropDownPeriod(Box hBox)
    {
        var factory = SignalListItemFactory.New();

        factory.OnSetup += (_, args) =>
        {
            ListItem listItem = (ListItem)args.Object;
            Label label = Label.New(null);
            label.Halign = Align.Start;
            listItem.SetChild(label);
        };

        factory.OnBind += (_, args) =>
        {
            ListItem listItem = (ListItem)args.Object;
            Label? label = (Label?)listItem.GetChild();
            if (listItem.GetItem() is PeriodItemRow item && label != null)
                label.SetText(item.Name);
        };

        DropDown dropDownPeriod = DropDown.New(PeriodForJournal.PeriodSelectionStore(), null);
        dropDownPeriod.Factory = factory;
        dropDownPeriod.OnNotify += (s, args) =>
        {
            if (args.Pspec.GetName() == "selected-item")
            {
                var dd = (DropDown)s;
                if (dd.SelectedItem is PeriodItemRow selectedItem)
                {
                    Console.WriteLine($"Обрано період: {selectedItem.TypePeriod}");
                }
            }
        };

        hBox.Append(dropDownPeriod);
    }
}

PeriodForJournal.cs
public static class PeriodForJournal
{
    /// <summary>
    /// Варіанти типів періодів
    /// </summary>
    public enum TypePeriod
    {
        AllPeriod = 1,
        Special,
        LastYear,
        ThisYear,
        LastQuarter,
        ThisQuarter,
        LastMonth,
        ThisMonth,
        LastWeek,
        ThisWeek,
        Yesterday,
        Today
    }

    /// <summary>
    /// Псевдонім для типу періоду
    /// </summary>
    /// <param name="value">Тип періоду</param>
    /// <returns>Назва</returns>
    static string TypePeriod_Alias(TypePeriod value)
    {
        return value switch
        {
            TypePeriod.AllPeriod => "Весь період",
            TypePeriod.Special => "Особливий",
            TypePeriod.LastYear => "Минулий рік",
            TypePeriod.ThisYear => "Цей рік",
            TypePeriod.LastQuarter => "Минулий квартал",
            TypePeriod.ThisQuarter => "Цей квартал",
            TypePeriod.LastMonth => "Минулий місяць",
            TypePeriod.ThisMonth => "Цей місяць",
            TypePeriod.LastWeek => "Минулий тиждень",
            TypePeriod.ThisWeek => "Цей тиждень",
            TypePeriod.Yesterday => "Вчора",
            TypePeriod.Today => "Сьогодні",
            _ => ""
        };
    }

    /// <summary>
    /// Повертає сховище з набором варантів періоду.
    /// Використовується із PeriodControl. Заготовка на майбутнє
    /// </summary>
    /// <returns>Сховище Gio.ListStore</returns>
    public static Gio.ListStore PeriodSelectionStore()
    {
        Gio.ListStore store = Gio.ListStore.New(PeriodItemRow.GetGType());

        foreach (TypePeriod value in Enum.GetValues<TypePeriod>())
            store.Append(new PeriodItemRow(value, TypePeriod_Alias(value)));

        return store;
    }
}

PeriodItemRow.cs
using GObject;

/// <summary>
/// Для сховища вибору варіантів періоду
/// </summary>
[Subclass<GObject.Object>]
partial class PeriodItemRow
{
    /// <summary>
    /// Тип періоду
    /// </summary>
    public PeriodForJournal.TypePeriod TypePeriod { get; set; } = PeriodForJournal.TypePeriod.AllPeriod;

    /// <summary>
    /// Назва
    /// </summary>
    public string Name { get; set; } = "";

    /// <summary>
    /// Конструктор
    /// </summary>
    /// <param name="typePeriod">Тип періоду</param>
    /// <param name="name">Назва</param>
    public PeriodItemRow(PeriodForJournal.TypePeriod typePeriod, string name) : this()
    {
        TypePeriod = typePeriod;
        Name = name;
    }
}

Довідка: Як встановити Gtk4 для Linux та Windows

Gtk4 - кросплатформовий набір інструментів для створення графічних інтерфейсів користувача
Gir.Core - обгортка над бібліотеками Gtk4 для мови програмування C#

Visual Studio Code
Віджети Gtk 4
NuGet пакет GirCore.Gtk-4.0
Приклад на GitHub


© accounting.org.ua - 2026