我一直在寻找如何从Windows Phone媒体库中列出专辑封面,但我没有找到任何答案。
我为wp8开发了一个音乐播放器,实际上我可以成功地将专辑信息列为专辑名称,艺术家姓名,持续时间等,但我无法获得AlbumArt。
以下是我实际使用的代码:
<phone:PhoneApplicationPage.Resources>
<DataTemplate x:Key="AlbumInfoTemplate">
<StackPanel VerticalAlignment="Top" Orientation="Horizontal">
<StackPanel Orientation="Vertical">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="90"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Image Source=" " Margin="5" Height="80" Width="80" Stretch="UniformToFill"/>
<StackPanel Grid.Column="1">
<TextBlock FontWeight="Normal" Text="{Binding Name}" Margin="10,0,0,0" FontSize="25" Foreground="Black"/>
<TextBlock FontWeight="Normal" Text="{Binding Artist}" Margin="10,0,0,0" FontSize="20" Foreground="Black" Opacity="0.75"/>
</StackPanel>
</Grid>
</StackPanel>
</StackPanel>
</DataTemplate>
</phone:PhoneApplicationPage.Resources>
<phone:LongListSelector
x:Name="llsAlbums"
SelectionChanged="llsAlbums_SelectionChanged"
Margin="0,-35,0,0"
JumpListStyle="{StaticResource JumpListStyle}"
Background="Transparent"
GroupHeaderTemplate="{StaticResource GroupHeaderTemplate}"
ItemTemplate="{StaticResource AlbumInfoTemplate}"
LayoutMode="List"
IsGroupingEnabled="true"
HideEmptyGroups ="true"/>
希望你能帮助我们!
答案 0 :(得分:0)
在此之前,您需要对XAML中的LongListSelector
定义进行一些小修改。将此ItemsSource="{Binding}"
添加到其中。那应该是这样的。
<phone:LongListSelector
x:Name="llsAlbums"
SelectionChanged="llsAlbums_SelectionChanged"
Margin="0,-35,0,0"
JumpListStyle="{StaticResource JumpListStyle}"
Background="Transparent"
GroupHeaderTemplate="{StaticResource GroupHeaderTemplate}"
ItemTemplate="{StaticResource AlbumInfoTemplate}"
LayoutMode="List"
IsGroupingEnabled="true"
HideEmptyGroups ="true"
ItemsSource="{Binding}"/>
由于您在JumpLists
中使用GroupHeaders
和LongListSelector
,因此您需要比平常更多的工作。首先创建一个类来保存相册信息。让我们称之为MusicAlbum
就像这样。
public class MusicAlbum
{
public string Name { get; set; }
public string Artist { get; set; }
public BitmapImage Art { get; set; }
}
然后创建此类和方法,以便GroupHeaders和JumpLists工作。
public class AlphaKeyGroup<T> : List<T>
{
public delegate string GetKeyDelegate(T item);
public string Key { get; private set; }
public AlphaKeyGroup(string key)
{
Key = key;
}
private static List<AlphaKeyGroup<T>> CreateGroups(SortedLocaleGrouping slg)
{
List<AlphaKeyGroup<T>> list = new List<AlphaKeyGroup<T>>();
foreach (string key in slg.GroupDisplayNames)
{
list.Add(new AlphaKeyGroup<T>(key));
}
return list;
}
public static List<AlphaKeyGroup<T>> CreateGroups(IEnumerable<T> items, CultureInfo ci, GetKeyDelegate getKey, bool sort)
{
SortedLocaleGrouping slg = new SortedLocaleGrouping(ci);
List<AlphaKeyGroup<T>> list = CreateGroups(slg);
foreach (T item in items)
{
int index = 0;
index = slg.GetGroupIndex(getKey(item));
if (index >= 0 && index < list.Count)
{
list[index].Add(item);
}
}
if (sort)
{
foreach (AlphaKeyGroup<T> group in list)
{
group.Sort((c0, c1) => { return ci.CompareInfo.Compare(getKey(c0), getKey(c1)); });
}
}
return list;
}
}
在这里,我写了一个小方法来获得专辑的专辑封面,这很容易。
private BitmapImage GetAlbumArt(Album album)
{
BitmapImage img = new BitmapImage();
img.DecodePixelHeight = 80;
img.DecodePixelWidth = 80;
img.SetSource(album.GetAlbumArt());
return img;
}
然后,这些实际方法会从MediaLibrary
获取相册列表,并列出我们可以在LLS中使用的MusicAlbums
public List<MusicAlbum> GetAlbums()
{
if (lib == null)
lib = new MediaLibrary();
List<MusicAlbum> albumList = new List<MusicAlbum>();
var albums = lib.Albums;
foreach (var album in albums)
{
albumList.Add(new MusicAlbum()
{
Name = album.Name,
Artist = album.Artist.Name,
Art = album.HasArt ? GetAlbumArt(album) : null
});
}
return albumList;
}
完成此操作后,您需要创建列表并设置ItemSource
的{{1}}。在页面的构造函数中或在LongListSelector
方法中添加此代码。
OnNavigatedTo
然后你就完成了,运行应用程序,你会看到列出的专辑..