Как отображать изображения LocalFolder во флип-просмотре (универсальная разработка для Windows)

Часть xaml ниже. Приложение выдает/выдает никаких ошибок. также приложение генерирует точное количество слайдов. но просто получаю серые пустые области. он скользит; но места пустые.

 <FlipView x:Name="flipView1"">
        <FlipView.ItemTemplate>
            <DataTemplate>
                <Image>
                     <Image.Source>
                        <BitmapImage UriSource="{Binding PicFiles}" />
                </Image.Source>
                </Image>
            </DataTemplate>
        </FlipView.ItemTemplate>
    </FlipView>

и программный код

public sealed partial class PresentationPage : Page
{

    public ObservableCollection<Uri> PicFiles;
    public PresentationPage()
    {
        this.InitializeComponent();
        PicFiles = new ObservableCollection<Uri>();
        GetPicFilesFromStorePath();
    }

    private void GetPicFilesFromStorePath()
    {
        var path = Windows.Storage.ApplicationData.Current.LocalFolder.Path;

        var a = Directory.GetFiles(path, "*.*").Where(x => x.EndsWith(".jpg"));

        foreach (var x in a)
        {
            PicFiles.Add(new Uri(x,UriKind.Absolute));
        }
        flipView1.ItemsSource = PicFiles;
    }

person Zen Of Kursat    schedule 27.11.2017    source источник


Ответы (2)


Во-первых, приведенный выше код получает полное свойство пути файловой системы к файлу для доступа, что не рекомендуется. Вы можете использовать относительные API StoragFile. Подробности см. Пропустить путь: придерживаться StorageFile. QueryOptions можно использовать для фильтрации в ситуация.

Во-вторых, укажите полное значение пути файловой системы для UriSource не будет работать. Чтобы получить доступ к файлам, хранящимся в данных приложения, вы должны использовать Uri со схемой ms-appdata:. Подробности вы можете найти по ссылке Как загрузить файловые ресурсы (XAML).

Наконец, привязка неверна, вы привязываете всю коллекцию к свойству UriSource, на самом деле для этого требуется одно значение Uri коллекции.

Таким образом, обновленный полный фрагмент кода выглядит следующим образом:

<FlipView x:Name="flipView1" >
   <FlipView.ItemTemplate>
       <DataTemplate>
           <Image  >
               <Image.Source>
                   <BitmapImage UriSource="{Binding}" />
               </Image.Source>
           </Image>
       </DataTemplate>
   </FlipView.ItemTemplate>
</FlipView>

Код позади:

private async void GetPicFilesFromStorePath()
{
    //var path = Windows.Storage.ApplicationData.Current.LocalFolder.Path;

    //var a = Directory.GetFiles(Name, "*.*").Where(x => x.EndsWith(".jpg"));

    //foreach (var x in a)
    //{
    //    PicFiles.Add(new Uri((String.Format("ms-appdata:///local/{0}", x))));
    //}

    StorageFolder localfolder = Windows.Storage.ApplicationData.Current.LocalFolder;
    List<string> fileTypeFilter = new List<string>();
    fileTypeFilter.Add(".jpg");
    QueryOptions queryOptions = new QueryOptions(Windows.Storage.Search.CommonFileQuery.OrderByName, fileTypeFilter);
    StorageFileQueryResult queryResult = localfolder.CreateFileQueryWithOptions(queryOptions);
    var files = await queryResult.GetFilesAsync();
    foreach (StorageFile x in files)
    {
        PicFiles.Add(new Uri((String.Format("ms-appdata:///local/{0}", x.Name))));
    }
    flipView1.ItemsSource = PicFiles;
}
person Sunteen Wu    schedule 28.11.2017
comment
проблема уже решена с помощью префикса ms-appdata:///local/ после потери 8 часов. Я возвращаюсь сюда, чтобы ответить на мой вопрос сейчас. и увидел правильный ответ через день. - person Zen Of Kursat; 28.11.2017

аналогичное решение. Где-то я читал, что {x:binding} работает быстрее, чем {Binding}.

namespace Project1.Models
{
    public class PicFile
    {
        public Uri Img { get; set; }
    }

    public static class PicFileManager
    {
        private static readonly ObservableCollection<PicFile> PicFiles = new ObservableCollection<PicFile>();
        public static ObservableCollection<PicFile> GetPicFilesFromStorePath()
        {

            string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "Portaokul");

            var a = Directory.GetFiles(path, "*.*").Where(x => x.EndsWith(".jpg"));

            PicFiles.Clear();
            foreach (var x in a)
            {
                Uri uri_ = new Uri(
                   Path.Combine("ms-appdata:///local/Project1", Path.GetFileName(x)));

                PicFiles.Add(new PicFile { Img= uri_ });
            }
            return PicFiles; 
        }
    }
}

на странице

 public PresentationPage()
    {
        this.InitializeComponent();
        flipView1.ItemsSource = PicFileManager.GetPicFilesFromStorePath();

}

в xaml

 <FlipView x:Name="flipView1">
        <FlipView.ItemTemplate>
            <DataTemplate x:DataType="models:PicFile">
                <Image>
                    <Image.Source>
                        <BitmapImage UriSource="{x:Bind Img}"/>
                    </Image.Source>
                </Image>
            </DataTemplate>
        </FlipView.ItemTemplate>
    </FlipView>

и поверх xaml

   xmlns:models="using:Project1.Models"
person Zen Of Kursat    schedule 28.11.2017