2017-12-15 7 views
1

GTK#Monoチュートリアルページのコードに続いてGTK#Nodeview + NodeStoreを作成しました!私の変更は、NodeViewに新しいエントリを追加し、それを対話可能にするためのボタンを追加することでした。私の問題は、NodeView 選択変更イベントによってアプリケーションがクラッシュすることです。GTK#Nodeview Nodestoreは常にヌルリファレンスを取得します

using System; 
using Gtk; 

public partial class MainWindow : Window 
{ 
    Button button; 
    NodeView nodeview; 
    NodeStore nodestore; 

    [TreeNode(ListOnly = true)] 
    public class MyTreeNode : TreeNode 
    { 
     public MyTreeNode(string artist) 
     { 
      Artist = artist; 
     } 

     [TreeNodeValue(Column = 0)] 
     public string Artist; 
    } 


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

     var vbox = new VBox(); 
     nodeview = new NodeView(); 
     // Create a column with title Artist and bind its renderer to model column 0 
     nodeview.AppendColumn("Artist", new CellRendererText(), "text", 0); 

     nodestore = new NodeStore(typeof(MyTreeNode)); 
     nodestore.AddNode(new MyTreeNode("temp")); 
     nodeview.NodeStore = nodestore; 

     nodeview.Selection.Changed += Selection_Changed; 

     button = new Button("Add New!!"); 
     button.Clicked += Button_Clicked; 

     vbox.PackStart(nodeview, true, true, 0); 
     vbox.PackStart(button, false, true, 0); 

     Add(vbox); 
     ShowAll(); 
    } 

    void Button_Clicked(object sender, EventArgs e) 
    { 
     nodestore.AddNode(new MyTreeNode("temp")); 
    } 

    void Selection_Changed(object sender, EventArgs e) 
    { 
     NodeSelection selection = (NodeSelection)sender; 
     if (selection != null) 
     { 
      MyTreeNode node = (MyTreeNode)selection.SelectedNode; 
      var a = node.Artist; 
     } 
    } 

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


    } 
} 

NodeViewでノードを選択すると、アプリケーションは予告なくクラッシュします。 NodeSelection_Changedに入ると、NodeViewのNodeStore変数は常にnullであることに気付きました。ノードをノードに追加していても(ノードビューにレンダリングされています)。

+0

完全に動作するサンプルを提供できますか? nodeStoreがNodeViewに関連付けられている場所と場所はわかりません。 Mono GTK#サンプルでは、​​このサンプルが作成され、NodeViewのコンストラクタに渡されます。 –

+1

今すぐ完全な例をアップロードしました!同じ問題がここにある!もし可能ならば – xDGameStudios

答えて

1

これはfixedですが、Mono 5.8以降のバージョンでは提供されていないbug in GTK#と思われます。

回避策は、反映を使用してNodeViewクラスの 'store'フィールドを設定することです。

typeof (NodeView).GetField ("store", BindingFlags.Instance | BindingFlags.NonPublic).SetValue (nodeview, nodestore); 

あなただけNodeViewにnodestoreを設定する行の後に上記の行を追加した場合、これはNodeView.NodeStoreがnullであることが修正されます。

nodeview.NodeStore = nodestore; 
typeof (NodeView).GetField ("store", BindingFlags.Instance | BindingFlags.NonPublic).SetValue (nodeview, nodestore); 

はまた、送信者がGtk.TreeSelectionないGtk.NodeSelectionあるので、あなたがSELECTION_CHANGEDイベントに持っているコードが失敗していることに注意してください。 Selection_Changedメソッドを次のように変更しました。

void Selection_Changed(object sender, EventArgs e) 
{ 
    NodeSelection selection = nodeview.NodeSelection; 
    if (selection != null) 
    { 
     MyTreeNode node = (MyTreeNode)selection.SelectedNode; 
     var a = node.Artist; 
    } 
} 
+0

+10!バグリファレンスと回避策のコピーは非常に役に立ちます。ありがとう。 – Barton

関連する問題