30.05.2024 16:43 Gtk3
Демонстрація роботи з віджетом Notebook
Віджет Notebook дозволяє створювати безліч сторінок з різним наповненням.
dotnet new consoledotnet add package GtkSharpdotnet runusing Gtk;
class Program
{
public static void Main()
{
Application.Init();
new FirstWindow();
Application.Run();
}
public static void Quit()
{
Application.Quit();
}
}using Gtk;
class FirstWindow : Window
{
Notebook notebook = new()
{
Scrollable = true,
EnablePopup = true,
BorderWidth = 0,
ShowBorder = false,
TabPos = PositionType.Top
};
//Список для збереження історії послідовності відкриття вкладок
List<string> historyNotebookSwitchList = [];
public FirstWindow() : base("Test")
{
SetDefaultSize(800, 900);
SetPosition(WindowPosition.Center);
Maximize();
DeleteEvent += delegate { Program.Quit(); };
VBox vBox = new VBox();
Add(vBox);
HBox hBoxButton = new HBox();
vBox.PackStart(hBoxButton, false, false, 5);
Button buttonAddPage = new Button("Додати сторінку");
buttonAddPage.Clicked += OnAddPage;
hBoxButton.PackStart(buttonAddPage, false, false, 5);
HBox hBox = new HBox();
vBox.PackStart(hBox, true, true, 0);
hBox.PackStart(notebook, true, true, 0);
notebook.SwitchPage += OnSwitchPageNotebook;
ShowAll();
}
void OnAddPage(object? sender, EventArgs args)
{
//Функція яка будує вміст сторінки блокноту
static Widget func()
{
VBox vBox = new VBox();
HBox hBox = new HBox();
vBox.PackStart(hBox, false, false, 0);
hBox.PackStart(new Label("Test"), false, false, 5);
return vBox;
}
CreateNotebookPage("Нова сторінка", func, false);
}
//Переключення сторінок блокноту
void OnSwitchPageNotebook(object? sender, SwitchPageArgs args)
{
string currPageUID = args.Page.Name;
if (historyNotebookSwitchList.Contains(currPageUID))
historyNotebookSwitchList.Remove(currPageUID);
/* Поточна сторінка ставиться у кінець списку */
historyNotebookSwitchList.Add(currPageUID);
}
// Створити сторінку в блокноті.
// Код сторінки задається в назву віджета - widget.Name = codePage;
void CreateNotebookPage(string tabName, Func<Widget>? pageWidget, bool insertPage = false)
{
int numPage;
string codePage = Guid.NewGuid().ToString();
ScrolledWindow scroll = new() { ShadowType = ShadowType.In, Name = codePage };
scroll.SetPolicy(PolicyType.Automatic, PolicyType.Automatic);
HBox hBoxLabel = CreateLabelPageWidget(tabName, codePage, notebook);
if (insertPage)
numPage = notebook.InsertPage(scroll, hBoxLabel, notebook.CurrentPage);
else
numPage = notebook.AppendPage(scroll, hBoxLabel);
//Переміщення сторінок
notebook.SetTabReorderable(scroll, true);
if (pageWidget != null)
{
Widget widget = pageWidget.Invoke();
scroll.Add(widget);
widget.Name = codePage;
}
notebook.ShowAll();
notebook.CurrentPage = numPage;
notebook.GrabFocus();
}
// Заголовок сторінки блокноту
HBox CreateLabelPageWidget(string caption, string codePage, Notebook notebook)
{
HBox hBoxLabel = new HBox();
//Ico
hBoxLabel.PackStart(new Image(Stock.File, IconSize.Menu), false, false, 2);
//Текст
Label label = new() { Text = caption, TooltipText = caption, Expand = false, Halign = Align.Start };
hBoxLabel.PackStart(label, false, false, 2);
//Лінк закриття сторінки
LinkButton lbClose = new("Закрити", "")
{
Image = new Image(Stock.Close, IconSize.Menu),
AlwaysShowImage = true,
Name = codePage
};
lbClose.Clicked += (object? sender, EventArgs args) =>
{
CloseNotebookPageToCode(notebook, ((Widget)sender!).Name);
};
hBoxLabel.PackEnd(lbClose, false, false, 0);
hBoxLabel.ShowAll();
return hBoxLabel;
}
// Закрити сторінку блокноту по коду
void CloseNotebookPageToCode(Notebook notebook, string codePage)
{
notebook.Foreach(
(Widget wg) =>
{
if (wg.Name == codePage)
{
if (historyNotebookSwitchList.Contains(codePage))
historyNotebookSwitchList.Remove(codePage);
if (historyNotebookSwitchList.Count > 0)
CurrentNotebookPageToCode(notebook, historyNotebookSwitchList[historyNotebookSwitchList.Count - 1]);
notebook.DetachTab(wg);
}
});
}
// Встановлення поточної сторінки по коду
void CurrentNotebookPageToCode(Notebook notebook, string codePage)
{
int counter = 0;
notebook.Foreach(
(Widget wg) =>
{
if (wg.Name == codePage)
notebook.CurrentPage = counter;
counter++;
});
}
}© accounting.org.ua - 2025