ListBox с несколькими захваченными изображениями Windows Phone

Кто-нибудь знает, как сделать список с несколькими изображениями. Я хочу иметь возможность захватить изображение, а затем отобразить его на экране, затем захватить другое и отобразить после первого и так далее. Это в основном страница галереи изображений, которую я хочу создать. Я хотел бы сохранить их где-нибудь на телефоне, чтобы их можно было получить, когда приложение снова запустится.

Должно получиться примерно так, как на картинке: http://blog.xamarin.com/wp-content/uploads/2012/02/wp2.png

Заранее спасибо, искал по этому поводу, но ничего не нашел.


person Jordan    schedule 22.06.2013    source источник


Ответы (1)


Что ж, это довольно легко. Вы используете ListBox, устанавливаете ItemsPanel в WrapPanel и либо привязываете ItemsSource к ObservableCollection (или к списку/массиву, но ObservableCollection лучше подходит для привязок).

Есть несколько способов сделать это. Давайте возьмем самый простой подход. В xaml вы определяете свой ListBox:

<ListBox x:Name="listbox">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>

            <toolkit:WrapPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>

        <DataTemplate>
            <Grid Margin="5"
                  Background="{StaticResource PhoneChromeBrush}"
                  Height="180"
                  Width="180">
                <Image Source="{Binding}" />
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

В вашем коде вы можете загружать изображения примерно так:

ObservableCollection<BitmapImage> images = new ObservableCollection<BitmapImage>();
List<String> bitmapuris = ....
using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication())
{
    foreach(var bitmapuri in bitmapuris)
    {
        System.Windows.Media.Imaging.BitmapImage bitmap = new System.Windows.Media.Imaging.BitmapImage();

        if (isoStore.FileExists(bitmapuri))
        {
            using (IsolatedStorageFileStream stream = isoStore.OpenFile(bitmapuri, System.IO.FileMode.Open, System.IO.FileAccess.Read))
            {
                bitmap.CreateOptions = System.Windows.Media.Imaging.BitmapCreateOptions.BackgroundCreation;
                bitmap.SetSource(stream);
            }
        }
        images.Add(bitmap);
    }
}
listbox.ItemsSource = images;

Bitmapuris представляет собой список со всеми URL-адресами сохраненных изображений.

В основном это то, что я использую в некоторых своих приложениях (хотя я использую ViewModels и Bindings и не устанавливаю ItemsSource вручную)

Надеюсь это поможет

edit: о том, как захватывать и сохранять изображения, вы можете прочитать в этой статье: http://www.c-sharpcorner.com/UploadFile/mahakgupta/capture-save-and-edit-image-in-windows-phone-7/

Я бы сохранил изображения в определенной папке, например «/Images/». Таким образом, вы можете загрузить все изображения, которые вы ранее записали в свое приложение, начиная с кода, который я разместил выше, с List<String> bitmapuris, установленным с помощью этого метода:

List<String> getFiles(String folderpath)
{
    IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication();
    return storage.GetFileNames(folderpath).ToList();
}

вот так List<String> bitmapuris = getFiles("/Images/*");

и когда вы захватили изображение, вы можете просто добавить его в свой ListBox следующим образом:

System.Windows.Media.Imaging.BitmapImage bitmap = new System.Windows.Media.Imaging.BitmapImage();
bitmap.CreateOptions = System.Windows.Media.Imaging.BitmapCreateOptions.BackgroundCreation;
bitmap.SetSource(myimagestream);
images.Add(bitmap);

предоставление изображений - это ObservableCollection<BitmapImage>, который вы установили в качестве ItemsSource в свой ListBox.

Теперь это почти ваше полностью работающее приложение, в сочетании со ссылкой выше.

person Stefan Wexel    schedule 23.06.2013
comment
@Stefan.. Спасибо, это дало мне приблизительное представление о том, что я должен делать, но если есть какой-либо пример приложения или полный исходный код, это будет очень полезно, еще раз спасибо. - person Jordan; 24.06.2013
comment
@Stefan.. Я вполне доволен вашим кодом xaml, но когда дело доходит до его фактического кода, я думаю, что немного расстраиваюсь. Все, что я хочу сделать, это иметь страницу, которая позволяет мне захватывать изображения и сохранять их в изолированном хранилище, затем извлекать то же изображение и отображать его на странице и так далее. Поэтому я хочу, чтобы на странице была возможность хранить множество захваченных изображений в виде списка. Спасибо за помощь в любом случае, надеюсь, вы можете помочь мне еще больше - person Jordan; 26.06.2013
comment
@Jordan Смотрите мое редактирование, теперь вам нужно только скопировать весь код, и у вас есть свое приложение. - person Stefan Wexel; 26.06.2013
comment
@Stefan.. Большое спасибо за помощь. Я скопировал ваш код и поместил на нужную страницу, и он отлично работает, единственное, что он не делает, это сохраняет изображения в изолированном хранилище, мне нужно понять, как это сделать, еще раз спасибо - person Jordan; 26.06.2013
comment
@Jordan Посмотрите на ссылку в моем ответе, есть способ сохранить изображение. Вы можете просто взять это, и вам нужно будет изменить только одну строку кода (вот снова ссылка: c-sharpcorner.com/UploadFile/mahakgupta/). Пожалуйста, отметьте ответ как ответ, если он вам помог. - person Stefan Wexel; 26.06.2013
comment
@Stefan.. Еще раз спасибо, я просмотрел ссылку, которую вы разместили здесь. Это очень полезно, теперь я понимаю процедуру сохранения изображений, но, как всегда, я наткнулся на то, до чего не могу додуматься. Я не знаю, как сохранить изображение с именем, сгенерированным компьютером, или, возможно, с фактическими именами, используемыми в захваченных изображениях. Как я уже сказал, я буду добавлять большое количество изображений, поэтому я хочу, чтобы компьютер дал им имя. Если у вас есть какие-либо идеи, пожалуйста, поделитесь. Еще раз большое спасибо, вы очень полезны. Я также отметил ваш ответ зеленой галочкой :) - person Jordan; 26.06.2013