【问题标题】:Casting Gtk.NodeView to another class in C#将 Gtk.NodeView 投射到 C# 中的另一个类
【发布时间】:2019-03-12 16:04:49
【问题描述】:

我对 Gtk# 很陌生(不到一周),所以希望这不是一个完全错误的问题:

我在 Gtk# 窗口中有一个 NodeView 小部件。它只是一个歌曲列表。当我点击歌曲时,我想更新一个“正在播放:”标签。

到目前为止我的代码如下:

protected void onSongSelected(object o, RowActivatedArgs args)
    {
        object selection = o;
        //something needs to go here
        currentSongName.Text = selection.ToString();
    }

现在,我知道这是不正确的。但是,这给了我对象 o 的类型(以及变量“selection”),即“Gtk.NodeView”。但是,我无法弄清楚如何使用 NodeView 来访问所选节点中的任何信息。

我尝试按照此页面中的指南来解决我的问题: https://www.mono-project.com/docs/gui/gtksharp/widgets/nodeview-tutorial/

我创建了一个名为 MasterLibrary 的 TreeNode 类(几乎与示例相同)并尝试将 o 转换为 MasterLibrary 类型,如下所示:

object selection = (MasterLibrary)o;

但是,这会导致我的程序崩溃,因为说将 NodeView 强制转换为 MasterLibrary 类是无效的。

对于解决此问题的任何帮助将不胜感激。

【问题讨论】:

    标签: c# gtk gtk#


    【解决方案1】:

    可以使用Selection 属性来识别NodeView 的选定项。您需要使用 TreeIterTreeModel 如下:

    Gtk.TreeIter _i;
    Gtk.TreeModel _m;
    if (myNodeView.Selection.CountSelectedRows () > 0) {
      myNodeView.Selection.GetSelected (out _m, out _i);
      if (_m != null && _i != null) {
        currentSongName.text = _m.GetValue (_i, 0); // assuming your song name is in column 0 of the NodeView.
      }
    }
    

    请注意,最好先检查选定的行数以避免空引用异常,但我会这样做,并根据防御性编程对模型和迭代器进行空值检查。如果不同的列(即不是 col 0)包含您的歌曲名称,则只需将列 # 从 0 更改为其他内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 2019-02-12
      • 2019-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多