1

私は現在 mono と gtk# を使用しています。TreeView に関しては、このチュートリアルがあります。「モデルの使用方法の制御」で提示されているのと同じことを達成したいので、アーティストとタイトルを表示するためのソングクラスとレンダリングメソッドがあります。

しかし、ListStore ではなく TreeStore を介して表示したいと考えています。各レターにルートノードがあり、このノードの下に、このレターで始まるすべてのアーティストが表示されるようにします。

私の問題は、これらの 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;
}

したがって、各文字に RootNodes があり、各文字の下に、この文字で始まるすべてのアーティストがリストされている必要があります。

私の問題は、文字を TreeStore に追加する方法と、各ソングを挿入する場所を知る方法です。

これがどのように見えるかのスクリーンショットです(直接アップロードすることは許可されていません。したがって、外部ホストを使用する必要がありました。Sry): スクリーンショット

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 );
}

インデックスノードを動的に追加したい場合は、追加の作業を行う必要があります。あるレベルでノードを追加するたびに、そのレベルまたはそれより深いレベルのすべてのツリーイター値が無価値になります。

于 2012-03-20T21:02:49.453 に答える