在 C# 中将 Gtk.NodeView 转换为另一个 class
Casting Gtk.NodeView to another class in C#
我是 Gtk# 的新手(不到一周),所以希望这不是一个完全错误的问题:
我在 Gtk# window 中有一个 NodeView 小部件。它只是一个歌曲列表。当我点击歌曲时,我想更新一个 "Currently Playing:" 标签。
到目前为止我的代码如下:
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 class(与示例几乎相同)并尝试将 o 转换为 MasterLibrary 类型,如下所示:
object selection = (MasterLibrary)o;
但是,这会导致我的程序崩溃,因为它说将 NodeView 转换为 MasterLibrary 是无效的 class。
如能帮助解决此问题,我们将不胜感激。
可以使用Selection
属性 来识别NodeView 的选定项。您需要使用 TreeIter 和 TreeModel 如下:
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.
}
}
请注意,最好先检查选定的行数以避免空引用异常,但我会同时检查模型和基于防御性编程的迭代器上的空值。如果不同的列(即不是第 0 列)包含您的歌曲名称,则只需将列 # 从 0 更改为其他内容即可。
我是 Gtk# 的新手(不到一周),所以希望这不是一个完全错误的问题:
我在 Gtk# window 中有一个 NodeView 小部件。它只是一个歌曲列表。当我点击歌曲时,我想更新一个 "Currently Playing:" 标签。
到目前为止我的代码如下:
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 class(与示例几乎相同)并尝试将 o 转换为 MasterLibrary 类型,如下所示:
object selection = (MasterLibrary)o;
但是,这会导致我的程序崩溃,因为它说将 NodeView 转换为 MasterLibrary 是无效的 class。
如能帮助解决此问题,我们将不胜感激。
可以使用Selection
属性 来识别NodeView 的选定项。您需要使用 TreeIter 和 TreeModel 如下:
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.
}
}
请注意,最好先检查选定的行数以避免空引用异常,但我会同时检查模型和基于防御性编程的迭代器上的空值。如果不同的列(即不是第 0 列)包含您的歌曲名称,则只需将列 # 从 0 更改为其他内容即可。