1

我目前正在使用单声道和 gtk#。关于 TreeView 有这个Tutorial。我想实现在“控制模型的使用方式”下呈现的相同的东西所以我有歌曲类和渲染方法来显示艺术家和标题。

但我想通过 TreeStore 而不是 ListStore 来显示它。这样我每个字母都有一个根节点,并且在这个节点下应该显示所有以这个字母开头的艺术家。

我的问题如何将这些 RootNodes 添加到 TreeStore?我应该在哪里添加它们?

songs.Add(new Song("Dancing Djs vs. Roxette", "Fading like a flower"));
songs.Add(new Song("Xaiver","give me the right"));
songs.Add(new Song("Daft Punkt","Technologic"));

TreeStore musicListStore = new TreeStore(typeof(Song));
foreach (var s in songs) 
{
    musicListStore.AppendValues(s);
}

treeview1.Model = musicListStore;

treeview1.AppendColumn("Artist", new CellRendererText(),new TreeCellDataFunc(RenderArtistName));
treeview1.AppendColumn("Title", new CellRendererText(),new TreeCellDataFunc(RenderSongTitle));

private void RenderArtistName(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
{
    Song s = model.GetValue(iter,0) as Song;
    (cell as CellRendererText).Text = s.Artist;
}

private void RenderSongTitle(TreeViewColumn column, CellRenderer cell, TreeModel model, TreeIter iter)
{
    Song s = model.GetValue(iter,0) as Song;
    (cell as CellRendererText).Text = s.Title;
}

所以我想实现每个字母都有根节点,每个字母下面应该列出以这个字母开头的所有艺术家。

我的问题是如何将字母添加到 TreeStore 以及我如何知道在哪里插入每首歌曲。

这是我希望它看起来的屏幕截图(我不允许直接上传它们。所以我不得不使用外部托管。对不起): 屏幕截图

4

1 回答 1

2

你可以很容易地建立你的树。例如;

var store = new Gtk.TreeStore( typeof(string) );

// add a root node
var root = store.AppendValues("hello"); 

// add a child of the root
store.AppendValues(root,"world");

// add another child
var mono = store.AppendValues(root,"mono");

// add a second level child
store.AppendValues(mono,"gtk");

因此,在您的音乐应用程序的上下文中..

// title, artist
var store = new Gtk.TreeStore( typeof(string), typeof(string) );

// make an index of top level nodes using thier TreeIters
var index = new Dictionary<string,Gtk.TreeIter>();

// add index nodes
foreach ( var letter in new List<string>{ "A", "B", "C" ... "Z" } ){
    index[letter.ToLower()] = store.AppendValues( letter );
}

// add songs
foreach ( var song in songlist ){
    var title = song.Title;
    var artist = song.Artist;

    var first = title.SubString(0,1).ToLower();
    var iter = store[first];

    // add this song
    store.AppendValues( iter, title, artist );
}

如果要动态添加索引节点,则必须做一些额外的工作,每次在某个级别添加节点时,该级别或更深的所有 treeiter 值都会变得毫无价值。

于 2012-03-20T21:02:49.453 回答