dotnet new console
dotnet add package GtkSharp
dotnet run
using 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 - 2024