【问题标题】:WP8 get URI of images in MediaLibraryWP8 获取 MediaLibrary 中图像的 URI
【发布时间】:2014-02-26 11:14:56
【问题描述】:

由于我使用自己的 LongListSelector 让用户从图像中进行选择,我需要检索 Medialibrary 中所有图像的 URI。我还没有找到这样做的任何可能性。

我所看到的只是获取图像的名称:

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>

图库.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()));
        }

    }

导致不显示图像。调试器显示 imageas 已正确添加到我的列表中,但我什么也看不到。

【问题讨论】:

    标签: windows-phone-8 uri longlistselector media-library


    【解决方案1】:

    似乎 API 没有公开从媒体库返回的图片的 URI 属性。所以你需要用不同的方法来做。例如,您可以有一个 WritableBitmaps 列表而不是 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]

    【讨论】:

    • 似乎解码工作正常,但我的列表中没有显示任何内容。我会根据你的回答更新我的问题
    • 似乎 UI 没有更新为 ListOfImages 属性填充。要解决这个问题,请尝试:1.将 List&lt;WriteableBitmap&gt; 更改为 ObservableCollection&lt;WriteableBitmap&gt; 或 2.将 InitializeComponent(); 放在 foreach 块之后。
    • 两个都试过了(也都试过了),没有结果
    • 本部分中使用的数据绑定:ItemsSource={Binding ListOfImages} 需要 DataContext。除了我之前的建议之外,尝试在构造函数中添加this.DataContext = this;(在InitializeComponents(); 行之后)。
    • 我现在需要将选中的图片存入IsolatedStorage。我怎么能这样做?
    【解决方案2】:

    为什么需要路径?显示图像?如果只需要将列表中的图片显示为缩略图,可以使用流创建BitmapImage

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

    现在您可以将 bi 设置为 Image.Source

    【讨论】:

    • 是的,我想在我的 LongListSelector 中显示它。请参阅我编辑的问题。因为我想让用户在另一个页面中编辑图片,所以我首先想将路径作为字符串传递。但我想无论如何我都必须将图像保存到隔离存储中
    • 在您的视图模型中,您可以同时保留BitmapImage 和图像路径。然后将该路径传递给编辑页面。另外,不要使用GetImage,使用GetThumbail 而不是msdn.microsoft.com/en-us/library/ff434150.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多