如何在WP上列出媒体库中的专辑封面?

时间:2014-08-02 15:12:01

标签: windows-phone audio-player

我一直在寻找如何从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"/>

希望你能帮助我们!

1 个答案:

答案 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中使用GroupHeadersLongListSelector,因此您需要比平常更多的工作。首先创建一个类来保存相册信息。让我们称之为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

然后你就完成了,运行应用程序,你会看到列出的专辑..