1

ツリー ノードを削除できるコンテキスト メニューをツリー ノードに追加したいと考えています。

4

1 に答える 1

5

次の方法で実行できます。

  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;}
}
于 2009-06-06T06:28:05.083 に答える