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

dotnet new consoledotnet add package GirCore.Gtk-4.0dotnet add package GirCore.GObject-2.0.Integrationdotnet runusing 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);
}
}
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);
}
}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;
}
}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;
}
}Visual Studio Code
Віджети Gtk 4
NuGet пакет GirCore.Gtk-4.0
Приклад на GitHub
© accounting.org.ua - 2026