2017-12-15 92 views
1

GTK # Mono 튜토리얼 페이지의 코드 다음에 Nodeview + NodeStore를 만들었습니다! 내 변경 사항은 NodeView에 새 항목을 추가하고 상호 작용 가능하게하려고하는 단추를 추가하는 것이 었습니다. 내 문제는 NodeView 선택 변경 이벤트가 응용 프로그램을 충돌시키는 것입니다.GTK # Nodeview Nodestore는 항상 Null 참조를받습니다.

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