WP8 получает URI изображений в MediaLibrary

Поскольку я использую свой собственный LongListSelector, чтобы позволить пользователю выбирать из изображения, мне нужно получить URI всех изображений в Medialibrary. Я пока не нашел возможности сделать это.

Все, что я видел, это получить имя изображения:

MediaLibrary m = new MediaLibrary();

foreach (var r in m.Pictures)
{
    Stream imageStream = r.GetImage();
}

Как я могу получить остальную часть пути?

ИЗМЕНИТЬ

После первого решения:

Gallery.xaml

 <phone:LongListSelector 
                x:Name="GalleryLLS"
                LayoutMode="Grid" 
                GridCellSize="108,108"
                SelectionChanged="GalleryLLS_SelectionChanged"
                Margin="0,0,144,12"
                ItemsSource="{Binding ListOfImages}" >
                <phone:LongListSelector.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <Image Width="150" Height="150" 
                                Source="{Binding}"/>
                        </StackPanel>
                    </DataTemplate>
                </phone:LongListSelector.ItemTemplate>
            </phone:LongListSelector>

Gallery.xaml.cs

    private List<WriteableBitmap> _listOfImages = new List<WriteableBitmap>();

    public List<WriteableBitmap> ListOfImages
    {
        get { return _listOfImages; }

        set { _listOfImages = value; }
    }

    public Gallery()
    {
        InitializeComponent();

        var ml = new MediaLibrary();
        var Pictures = ml.Pictures;
        foreach (var item in Pictures)
        {
            ListOfImages.Add(PictureDecoder.DecodeJpeg(item.GetImage()));
        }

    }

приводит к тому, что изображения не отображаются. Отладчик показывает, что изображения правильно добавлены в мой список, но я ничего не вижу.


person 4ndro1d    schedule 26.02.2014    source источник


Ответы (2)


Похоже, что API не предоставляет свойство URI для изображений, возвращаемых из медиатеки. Поэтому вам нужно сделать это с другим подходом. Например, у вас может быть список WritableBitmap вместо списка URI:

private List<WriteableBitmap> _listOfImages = new List<WriteableBitmap>();
public List<WriteableBitmap> ListOfImages
{
    get { return _listOfImages; }

    set { _listOfImages = value; }
}
.......
.......
var ml = new MediaLibrary();            
var Pictures = ml.Pictures;
foreach (var item in Pictures)
{
    ListOfImages.Add(PictureDecoder.DecodeJpeg(item.GetImage()));
}
........
//in XAML
<phone:LongListSelector ItemsSource="{Binding ListOfImages}"> 
    <phone:LongListSelector.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Image Width="150" Height="150" 
                                Source="{Binding}"/> 
            </StackPanel>
        </DataTemplate>
    </phone:LongListSelector.ItemTemplate>
........
</phone:LongListSelector>
........

[Коды адаптированы с сайта http://www.neelesh-vishwakarma.com/2013/07/getting-images-from-albums-in-windows.html#.Uw3WtYU4T_g]

person har07    schedule 26.02.2014
comment
Кажется, декодирование работает нормально, но в моем списке ничего не отображается. Я обновлю свой вопрос в соответствии с вашим ответом - person 4ndro1d; 26.02.2014
comment
Кажется, что пользовательский интерфейс не обновляется, так как свойство ListOfImages заполнено. Чтобы решить эту проблему, попробуйте: 1. изменить List<WriteableBitmap> на ObservableCollection<WriteableBitmap> или 2. поставить InitializeComponent(); после блока foreach. - person har07; 26.02.2014
comment
Пробовал и то, и другое (вместе тоже), безрезультатно. - person 4ndro1d; 26.02.2014
comment
привязка данных, используемая в этой части: ItemsSource={Binding ListOfImages} требуется DataContext. Попробуйте добавить this.DataContext = this; в конструктор (где-то после строки InitializeComponents();), в дополнение к моему предыдущему предложению. - person har07; 26.02.2014
comment
Теперь мне нужно сохранить выбранное изображение в IsolatedStorage. Как я мог это сделать? - person 4ndro1d; 26.02.2014

Зачем тебе путь? Чтобы показать изображение? Если вам просто нужно показать изображение в списке в виде эскиза, вы можете использовать поток для создания BitmapImage:

var bi = new BitmapImage();
bi.SetSource(r.GetThumbnail());

Теперь вы можете установить этот bi как Image.Source.

person Toni Petrina    schedule 26.02.2014
comment
Да, я хотел бы показать это в моем LongListSelector. Смотрите мой отредактированный вопрос. Поскольку я хочу, чтобы пользователь редактировал изображение на другой странице, я сначала хотел передать путь в виде строки. Но я думаю, мне все равно придется сохранить изображение в изолированном хранилище. - person 4ndro1d; 26.02.2014
comment
В вашей модели просмотра вы можете сохранить как BitmapImage, так и путь к изображению. И вы передаете этот путь на страницу редактирования. Кроме того, не используйте GetImage, вместо этого используйте GetThumbail msdn.microsoft.com/en -us/library/ff434150.aspx. - person Toni Petrina; 26.02.2014