В то время как PhotoChooserTask
позволит пользователю выбрать только одно изображение из своей библиотеки (или захватить новое с их камеры, если для ShowCamera
установлено значение true), другой вариант будет продолжать позволять пользователю итеративно выбиратьизображений и не позволяют им продолжать работу до тех пор, пока они не выберут 9 (я полагаю, что это требование, которое вы выполняете?)
public partial class MainPage : PhoneApplicationPage {
public class SelectedPhoto : IDisposable {
public Stream Data { get; private set; }
public string Name { get; private set; }
public BitmapImage Image { get; private set; }
public SelectedPhoto(string name, Stream photo) {
Name = name;
Data = new MemoryStream();
photo.CopyTo(Data);
Image = new BitmapImage();
Image.SetSource(Data);
}
public void Dispose() {
Data.Dispose();
}
}
private List<SelectedPhoto> _selectedPhotos = new List<SelectedPhoto>();
private PhotoChooserTask photoChoserTask;
// Constructor
public MainPage() {
InitializeComponent();
photoChoserTask = new PhotoChooserTask();
photoChoserTask.Completed += new EventHandler<PhotoResult>(photoChooserTask_Completed);
ProcessImages.IsEnabled = false;
ImageListBox.ItemsSource = _selectedPhotos
}
void photoChooserTask_Completed(object sender, PhotoResult e) {
if (e.TaskResult == TaskResult.OK) {
_selectedPhotos.Add(new SelectedPhoto(e.OriginalFileName, e.ChosenPhoto);
Button.IsEnabled = _selectedPhotos.Count < 9;
ProcessImages.IsEnabled = _selectedPhotos.Count == 9;
}
}
private void Button_Click(object sender, RoutedEventArgs e) {
{
try {
photoChoserTask.Show();
} catch (System.InvalidOperationException) {
MessageBox.Show("An error occurred.");
}
}
}
private void ProcessImages_Click(object sender, RoutedEventArgs e) {
MessageBox.Show("Doing something with your images... please wait...");
}
}
В вашем XAML вместо одного изображения, которое вы хотите поместить в изображениевнутри ListBox
DataTemplate
и покажите все введенные пользователем изображения (возможно, с возможностью стереть изображение и добавить другое изображение).Например,
<ListBox x:Name="ImageListBox">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding Image}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<Button x:Name="ProcessImages" Click="ProcessImages_Click" />
Если требуется иметь от до 9 изображений, я бы предпочел этот подход по сравнению с настраиваемым множественным выбором изображений по нескольким причинам;
- Он предоставляет пользователю согласованный пользовательский интерфейс - такой же, какой он получал бы в любом другом приложении
- Используя
MediaLibrary
, ваше приложение потребует *Возможность 1019 * (отображается как «Доступ к библиотеке мультимедиа», я считаю). - Я бы нашел этот метод чуть менее трудоемким, чем полноценный выбор носителя.