<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # GTK# 中的高級小部件 > 原文: [http://zetcode.com/gui/gtksharp/advancedwidgets/](http://zetcode.com/gui/gtksharp/advancedwidgets/) 在 GTK# 編程教程的這一部分中,我們將介紹 GTK# 中的一些更高級的小部件。 我們將介紹`IconView,ListView`和`TreeView`小部件。 ## `IconView` `IconView`是一個小部件,在網格中顯示圖標列表。 `iconview.cs` ```cs using System; using System.IO; using Gtk; public class SharpApp : Window { const int COL_PATH = 0; const int COL_DISPLAY_NAME = 1; const int COL_PIXBUF = 2; const int COL_IS_DIRECTORY = 3; DirectoryInfo root = new DirectoryInfo("/"); Gdk.Pixbuf dirIcon, fileIcon; ListStore store; ToolButton upButton; public SharpApp() : base("IconView") { SetDefaultSize(650, 400); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; VBox vbox = new VBox(false, 0); Add(vbox); Toolbar toolbar = new Toolbar(); vbox.PackStart(toolbar, false, false, 0); upButton = new ToolButton(Stock.GoUp); upButton.IsImportant = true; upButton.Sensitive = false; toolbar.Insert(upButton, -1); ToolButton homeButton = new ToolButton(Stock.Home); homeButton.IsImportant = true; toolbar.Insert(homeButton, -1); fileIcon = GetIcon(Stock.File); dirIcon = GetIcon(Stock.Open); ScrolledWindow sw = new ScrolledWindow(); sw.ShadowType = ShadowType.EtchedIn; sw.SetPolicy(PolicyType.Automatic, PolicyType.Automatic); vbox.PackStart(sw, true, true, 0); store = CreateStore(); FillStore(); IconView iconView = new IconView(store); iconView.SelectionMode = SelectionMode.Multiple; upButton.Clicked += new EventHandler(OnUpClicked); homeButton.Clicked += new EventHandler(OnHomeClicked); iconView.TextColumn = COL_DISPLAY_NAME; iconView.PixbufColumn = COL_PIXBUF; iconView.ItemActivated += OnItemActivated; sw.Add(iconView); iconView.GrabFocus(); ShowAll(); } Gdk.Pixbuf GetIcon(string name) { return Gtk.IconTheme.Default.LoadIcon(name, 48, (IconLookupFlags) 0); } ListStore CreateStore() { ListStore store = new ListStore(typeof (string), typeof(string), typeo (Gdk.Pixbuf), typeof(bool)); store.SetSortColumnId(COL_DISPLAY_NAME, SortType.Ascending); return store; } void FillStore() { store.Clear(); if (!root.Exists) return; foreach (DirectoryInfo di in root.GetDirectories()) { if (!di.Name.StartsWith(".")) store.AppendValues(di.FullName, di.Name, dirIcon, true); } foreach (FileInfo file in root.GetFiles()) { if (!file.Name.StartsWith(".")) store.AppendValues(file.FullName, file.Name, fileIcon, false); } } void OnHomeClicked(object sender, EventArgs a) { root = new DirectoryInfo(Environment.GetFolderPath( Environment.SpecialFolder.Personal)); FillStore(); upButton.Sensitive = true; } void OnItemActivated(object sender, ItemActivatedArgs a) { TreeIter iter; store.GetIter(out iter, a.Path); string path = (string) store.GetValue(iter, COL_PATH); bool isDir = (bool) store.GetValue(iter, COL_IS_DIRECTORY); if (!isDir) return; root = new DirectoryInfo(path); FillStore(); upButton.Sensitive = true; } void OnUpClicked(object sender, EventArgs a) { root = root.Parent; FillStore(); upButton.Sensitive = (root.FullName == "/" ? false : true); } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } } ``` 本示例顯示當前所選目錄的圖標。 它有一個工具欄和兩個按鈕。 向上按鈕和主頁按鈕。 我們使用它們來瀏覽文件系統。 ```cs ListStore store; ``` `ListStore`是一個列列表數據結構。 我們使用它來存儲`IconView`小部件的數據。 ```cs DirectoryInfo root = new DirectoryInfo("/"); ``` 這是根目錄。 我們從這里開始。 根目錄是我們在`IconView`小部件中顯示的目錄。 ```cs ListStore store = new ListStore(typeof(string), typeof(string), typeof(Gdk.Pixbuf), typeof(bool)); ``` 在`CreateStore()`方法中,我們創建`ListStore`對象。 它有四個參數。 路徑,目錄或文件的名稱,圖像以及確定它是目錄還是文件的布爾值。 ```cs foreach (DirectoryInfo di in root.GetDirectories()) { if (!di.Name.StartsWith(".")) store.AppendValues(di.FullName, di.Name, dirIcon, true); } ``` 在`FillStore()`方法中,我們用數據填充列表存儲。 在這里,我們找出當前路徑中的所有目錄。 ```cs void OnHomeClicked(object sender, EventArgs a) { root = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); FillStore(); upButton.Sensitive = true; } ``` 如果單擊主頁按鈕,則將獲得對主目錄的引用。 重新填充列表存儲。 并激活向上按鈕。 ```cs void OnItemActivated(object sender, ItemActivatedArgs a) { ... } ``` 在`OnItemActivated()`方法中,當我們從圖標視圖小部件中單擊一個圖標時,我們會對生成的事件做出反應。 ```cs string path = (string) store.GetValue(iter, COL_PATH); bool isDir = (bool) store.GetValue(iter, COL_IS_DIRECTORY); if (!isDir) return; ``` 我們得到激活項目的路徑。 然后我們確定它是目錄還是文件。 如果是文件,我們返回。 ```cs root = new DirectoryInfo(path); FillStore(); upButton.Sensitive = true; ``` 如果是目錄,我們將根目錄替換為當前路徑,重新填充商店,然后使向上按鈕敏感。 ```cs void OnUpClicked(object sender, EventArgs a) { root = root.Parent; FillStore(); upButton.Sensitive = (root.FullName == "/" ? false : true); } ``` 如果單擊向上按鈕,則將根目錄替換為其父目錄。 重新填充列表存儲。 如果我們位于文件系統的根(/)目錄下,則向上按鈕將被激活。 ![IconView](https://img.kancloud.cn/2e/56/2e5687f749ae33ac0ba6da1c4e04f964_379x245.jpg) 圖:圖標 View ## `ListView` 在下面的示例中,我們使用`TreeView`小部件顯示列表視圖。 同樣`ListStore`用于存儲數據。 `listview.cs` ```cs using System; using System.Collections; using Gtk; public class Actress { public string Name; public string Place; public int Year; public Actress(string name, string place, int year) { Name = name; Place = place; Year = year; } } public class SharpApp : Window { ListStore store; Statusbar statusbar; enum Column { Name, Place, Year } Actress[] actresses = { new Actress("Jessica Alba", "Pomona", 1981), new Actress("Sigourney Weaver", "New York", 1949), new Actress("Angelina Jolie", "Los Angeles", 1975), new Actress("Natalie Portman", "Jerusalem", 1981), new Actress("Rachel Weissz", "London", 1971), new Actress("Scarlett Johansson", "New York", 1984) }; public SharpApp() : base ("ListView") { BorderWidth = 8; SetDefaultSize(350, 250); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; VBox vbox = new VBox(false, 8); ScrolledWindow sw = new ScrolledWindow(); sw.ShadowType = ShadowType.EtchedIn; sw.SetPolicy(PolicyType.Automatic, PolicyType.Automatic); vbox.PackStart(sw, true, true, 0); store = CreateModel(); TreeView treeView = new TreeView(store); treeView.RulesHint = true; treeView.RowActivated += OnRowActivated; sw.Add(treeView); AddColumns(treeView); statusbar = new Statusbar(); vbox.PackStart(statusbar, false, false, 0); Add(vbox); ShowAll(); } void OnRowActivated (object sender, RowActivatedArgs args) { TreeIter iter; TreeView view = (TreeView) sender; if (view.Model.GetIter(out iter, args.Path)) { string row = (string) view.Model.GetValue(iter, (int) Column.Name ); row += ", " + (string) view.Model.GetValue(iter, (int) Column.Place ); row += ", " + view.Model.GetValue(iter, (int) Column.Year ); statusbar.Push(0, row); } } void AddColumns(TreeView treeView) { CellRendererText rendererText = new CellRendererText(); TreeViewColumn column = new TreeViewColumn("Name", rendererText, "text", Column.Name); column.SortColumnId = (int) Column.Name; treeView.AppendColumn(column); rendererText = new CellRendererText(); column = new TreeViewColumn("Place", rendererText, "text", Column.Place); column.SortColumnId = (int) Column.Place; treeView.AppendColumn(column); rendererText = new CellRendererText(); column = new TreeViewColumn("Year", rendererText, "text", Column.Year); column.SortColumnId = (int) Column.Year; treeView.AppendColumn(column); } ListStore CreateModel() { ListStore store = new ListStore( typeof(string), typeof(string), typeof(int) ); foreach (Actress act in actresses) { store.AppendValues(act.Name, act.Place, act.Year ); } return store; } public static void Main() { Application.Init(); new SharpApp(); Application.Run(); } } ``` 在我們的示例中,我們在`TreeView`小部件中顯示了六個女演員的列表。 每行分別顯示名稱,出生地和出生年份。 ```cs public class Actress { public string Name; public string Place; public int Year; ... } ``` `Actress`類用于存儲有關女演員的數據。 ```cs ListStore CreateModel() { ListStore store = new ListStore( typeof(string), typeof(string), typeof(int) ); foreach (Actress act in actresses) { store.AppendValues(act.Name, act.Place, act.Year ); } return store; } ``` 在`CreateModel()`方法中,我們創建列表存儲。 列表存儲具有三個參數。 女演員的名字,出生地和出生年份。 這是我們的`TreeView`小部件的數據模型。 ```cs TreeView treeView = new TreeView(store); treeView.RulesHint = true; treeView.RowActivated += OnRowActivated; ``` 在這里,我們以列表存儲為參數創建`TreeView`小部件。 ```cs CellRendererText rendererText = new CellRendererText(); TreeViewColumn column = new TreeViewColumn("Name", rendererText, "text", Column.Name); column.SortColumnId = (int) Column.Name; treeView.AppendColumn(column); ``` 在`AddColumns()`方法中,我們向`TreeView`小部件中添加了三列。 上面的代碼創建了一個顯示女演員姓名的列。 ```cs if (view.Model.GetIter(out iter, args.Path)) { string row = (string) view.Model.GetValue(iter, (int) Column.Name ); row += ", " + (string) view.Model.GetValue(iter, (int) Column.Place ); row += ", " + view.Model.GetValue(iter, (int) Column.Year ); statusbar.Push(0, row); } ``` 如果雙擊某個項目,則會在狀態欄中顯示整行。 ![ListView](https://img.kancloud.cn/00/29/002960bc91c3764ce83aa76165d5e1da_358x278.jpg) 圖:`ListView` ## `TreeView` 在本章的最后一個示例中,我們使用`TreeView`小部件顯示分層的數據樹。 `tree.cs` ```cs using Gtk; public class SharpApp : Window { public SharpApp() : base ("Tree") { SetDefaultSize(400, 300); SetPosition(WindowPosition.Center); DeleteEvent += delegate { Application.Quit(); }; TreeView tree = new TreeView(); TreeViewColumn languages = new TreeViewColumn(); languages.Title = "Programming languages"; CellRendererText cell = new CellRendererText(); languages.PackStart(cell, true); languages.AddAttribute(cell, "text", 0); TreeStore treestore = new TreeStore(typeof(string), typeof(string)); TreeIter iter = treestore.AppendValues("Scripting languages"); treestore.AppendValues(iter, "Python"); treestore.AppendValues(iter, "PHP"); treestore.AppendValues(iter, "Perl"); treestore.AppendValues(iter, "Ruby"); iter = treestore.AppendValues("Compiling languages"); treestore.AppendValues(iter, "C#"); treestore.AppendValues(iter, "C++"); treestore.AppendValues(iter, "C"); treestore.AppendValues(iter, "Java"); tree.AppendColumn(languages); tree.Model = treestore; Add(tree); ShowAll(); } public static void Main() { Gtk.Application.Init(); new SharpApp(); Gtk.Application.Run(); } } ``` 這次我們使用`TreeView`小部件顯示分層數據。 ```cs TreeView tree = new TreeView(); ``` `TreeView`小部件已創建。 ```cs TreeViewColumn languages = new TreeViewColumn(); languages.Title = "Programming languages"; ``` 它有一列名為`"Programming languages"`。 ```cs CellRendererText cell = new CellRendererText(); languages.PackStart(cell, true); languages.AddAttribute(cell, "text", 0); ``` 我們在`TreeView`小部件中顯示文本數據。 ```cs TreeStore treestore = new TreeStore(typeof(string), typeof(string)); ``` 要存儲數據,我們使用`TreeStore`對象。 ```cs TreeIter iter = treestore.AppendValues("Scripting languages"); treestore.AppendValues(iter, "Python"); treestore.AppendValues(iter, "PHP"); ``` 我們將數據附加到樹上。 `TreeIter`用于連續訪問數據。 ```cs tree.AppendColumn(languages); ``` 一列被附加到樹上。 ```cs tree.Model = treestore; ``` 最后,我們為樹小部件設置數據模型。 ![Tree](https://img.kancloud.cn/ec/bc/ecbca76fd4092d627c1c09b23d8431e7_408x328.jpg) 圖:`Tree` 在本章中,我們討論的是高級 GTK# 小部件。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看