c# - 如何在 Gtk# 中将上下文菜单添加到树节点?

标签 c# contextmenu gtk#

我想向树节点添加一个上下文菜单,允许我删除该树节点。

最佳答案

可以通过以下方式完成:

  1. 处理 NodeView 的 ButtonPressEvent。您必须将 GLib.ConnectBeforeAttribute 应用于事件处理程序。
  2. 创建一个菜单并在按下鼠标右键时调用它的 Popup() 方法。
  3. 处理菜单项的 ButtonPressEvent 并使用 NodeView 的 NodeSelection 属性删除节点。

从一个空窗口开始,代码如下所示:

using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{   
    NodeView myNodeView;
    NodeStore store;

    public MainWindow (): base (Gtk.WindowType.Toplevel)
    {
        Build ();

        store = new Gtk.NodeStore (typeof (MyTreeNode));
        store.AddNode (new MyTreeNode ("Item A"));
        store.AddNode (new MyTreeNode ("Item B"));
        store.AddNode (new MyTreeNode ("Item C"));

        myNodeView = new NodeView(store);
        myNodeView.ButtonPressEvent += new ButtonPressEventHandler(OnItemButtonPressed);

        myNodeView.AppendColumn ("Deletable items", new Gtk.CellRendererText (), "text", 0);
        myNodeView.ShowAll ();
        Add (myNodeView);
    }

    [GLib.ConnectBeforeAttribute]
    protected void OnItemButtonPressed (object sender, ButtonPressEventArgs e)
    {
        if (e.Event.Button == 3) /* right click */
        {
            Menu m = new Menu();
            MenuItem deleteItem = new MenuItem("Delete this item");
            deleteItem.ButtonPressEvent += new ButtonPressEventHandler(OnDeleteItemButtonPressed);
            m.Add(deleteItem);
            m.ShowAll();
            m.Popup();
        }
    }                                                           

    protected void OnDeleteItemButtonPressed (object sender, ButtonPressEventArgs e)
    {
        MyTreeNode node = (MyTreeNode)myNodeView.NodeSelection.SelectedNode;
        store.RemoveNode(node);
    }

    protected void OnDeleteEvent (object sender, DeleteEventArgs a)
    {
        Application.Quit ();
        a.RetVal = true;
    }
}

public class MyTreeNode : Gtk.TreeNode {

    public MyTreeNode (string text)
    {
        ItemText=text;
    }

    [Gtk.TreeNodeValue (Column=0)]
    public string ItemText {get; set;}
}

关于c# - 如何在 Gtk# 中将上下文菜单添加到树节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/951995/

相关文章:

c# - 如何在.NET CORE类库中添加service.AddDbContext

wpf - 将按钮单击事件上的WPF上下文菜单更改为MVVM

c# - GTK# : What should the parameter of ListStore be ?

C# GTK 拖放

c# - 返回复杂对象或使用引用/输出参数是更好的做法吗?

c# - 变量神秘变化的值(value)

C# 生成 Azure 表存储 ConnectionString

android - 自定义 ListView 和上下文菜单。如何得到它?

javascript - 尝试从 jquery-contextmenu 菜单中动态删除 "sep1"项。我该如何处理它?

gtk# - 当 Gtk# 窗口调用 DeleteEvent 时,如何防止窗口关闭?