我正在为我的论文编写一个程序,希望完成后能让你使用标签数据对音乐文件进行排序。目前,我有一个wpf树视图,我想要显示的所有音乐的列表,该程序已找到按Artist>Album>Title排序。我有一个使用taglib#收集的标记文件列表,可以用来为每个曲目创建TreeViewItems,然后可以将它们添加到TreeView中。问题是,我似乎无法避免添加艺术家/专辑的副本,而不是将曲目添加为已添加的艺术家/专辑的子集。我一直在尝试使用foreach遍历项目,如果标题(艺术家姓名)与要添加的新艺术家的标题匹配,则转到专辑并将其添加为当前项目的子项,然后对专辑执行相同的检查并转到曲目标题,依此类推。我一直有点不高兴,因为即使标题完全匹配,它们似乎总是以不匹配的形式返回,因此添加了一个重复的艺术家。
我对TreeViews的使用完全陌生,所以我不确定我是否以最好的方式来做这件事,或者这只是我逻辑上的一个缺陷,所以任何帮助都将不胜感激。
附件是我用来创建和检查项目的代码。
public void PopulateTreeView(TreeView searchResults)
{
foreach (TagLib.File tagFile in tagFiles)
{
TreeViewItem Artist;
TreeViewItem Album;
TreeViewItem Title;
//creating the TreeViewItems
Artist = SetArtistsName(tagFile);
Album = SetAlbumName(tagFile);
Title = SetTrackName(tagFile);
//adding them to TreeView
AddArtistToTreeView(tagFile, searchResults, Artist, Album, Title);
}
}创建TreeViewItems的函数
private TreeViewItem SetArtistsName(TagLib.File tagFile)
{
TreeViewItem Artist = new TreeViewItem();
if (tagFile.Tag.AlbumArtists.Length == 0)
{
Artist.Header = "Unknown Artist";
return Artist;
}
else
{
Artist.Header = tagFile.Tag.AlbumArtists[0].ToString();
return Artist;
}
}
private TreeViewItem SetAlbumName(TagLib.File tagFile)
{
TreeViewItem Album = new TreeViewItem();
Album.Header = tagFile.Tag.Album;
return Album;
}
private TreeViewItem SetTrackName(TagLib.File tagFile)
{
TreeViewItem Track = new TreeViewItem();
Track.Header = tagFile.Tag.Title;
return Track;
}以及添加到TreeView/检查重复项的代码
private void AddArtistToTreeView(TagLib.File tagFile, TreeView searchResults, TreeViewItem Artist, TreeViewItem Album, TreeViewItem Title)
{
if (searchResults.Items.Count == 0)
{
searchResults.Items.Add(Artist);
Artist.Items.Add(Album);
Album.Items.Add(Title);
}
else
{
artistFlag = CheckArtist(searchResults, Artist);
switch (artistFlag)
{
case 0:
searchResults.Items.Add(Artist);
if (Artist.Items.Count == 0)
{
Artist.Items.Add(Album);
Album.Items.Add(Title);
}
break;
case 1:
albumFlag = CheckAlbum(Artist, Album);
switch (albumFlag)
{
case 0:
Artist.Items.Add(Album);
if (Album.Items.Count == 0)
{
Album.Items.Add(Title);
}
break;
case 1:
trackFlag = CheckTitle(Album, Title);
break;
case 2:
break;
}
break;
case 2:
break;
}
}
}
private int CheckArtist(TreeView searchResults, TreeViewItem Artist)
{
if (searchResults.Items.Count == 0)
{
return 0;
}
else
{
foreach (TreeViewItem tvi in searchResults.Items)
{
if (tvi.Header.ToString() != Artist.Header.ToString())
{
return 0;
}
else
{
return 1;
}
}
return 2;
}
}
private int CheckAlbum(TreeViewItem Artist, TreeViewItem Album)
{
if (Artist.Items.Count == 0)
{
return 0;
}
else
{
foreach (TreeViewItem tvi in Artist.Items)
{
if (tvi.Header.ToString() != Album.Header.ToString())
{
return 0;
}
else
{
return 1;
}
}
return 2;
}
}
private int CheckTitle(TreeViewItem Album, TreeViewItem Title)
{
if (Album.Items.Count == 0)
{
return 0;
}
else
{
foreach (TreeViewItem tvi in Album.Items)
{
if (tvi.Header.ToString() != Title.Header.ToString())
{
return 0;
}
else
{
return 1;
}
}
return 2;
}
}很抱歉,这篇文章有点长,但再次感谢您的帮助:)谢谢
发布于 2011-07-12 07:16:26
对我来说,这似乎是一种混乱且容易出错的方法,你尝试做的事情听起来最好是由CollectionViews来处理,它允许你在不手动创建所有必要的父容器的情况下进行group your items。在WPF中,你应该只在代码中处理最小程度的UIElements,大多数事情都可以通过templating在XAML中处理。因此,您可以将所有TreeViewItems都bind到CollectionViews,每个分组都按另一个属性进行。
https://stackoverflow.com/questions/6657559
复制相似问题