0

メディアライブラリからラップパネル内のリストボックスに画像を取得しています。選択した画像(複数選択リストボックス)を分離ストレージに保存したいと思います。

リストボックスのxaml

    <ListBox Name="vaultbox" SelectionMode="Multiple" 
                ItemContainerStyle="{StaticResource ListBoxItemStyle1}">
     <TextBlock Text="It is so lonely here..." Visibility="Collapsed" />
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <toolkit:WrapPanel ItemWidth="200" ItemHeight="200"/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Image Name="image2" 
                               Stretch="Fill" 
                               VerticalAlignment="Top" Source="{Binding}" />
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

私はここで迷子になっています。私はこれをやろうとしていました。

    List<BitmapImage> vltBitmapImage = new List<BitmapImage>();

        foreach (string fileName in fileStorage.GetFileNames("images//*.*"))
        {
            if (fileName == null)
                break;
            string filepath = System.IO.Path.Combine("images", fileName);
            using(IsolatedStorageFileStream imageStream =        
                          fileStorage.OpenFile(filepath,FileMode.Open,FileAccess.Read))
            {
                var imageSource=PictureDecoder.DecodeJpeg(imageStream);
                BitmapImage bitmapImage = new BitmapImage();
                bitmapImage.SetSource(imageStream);
                vltBitmapImage.Add(bitmapImage);
            }
        }


        this.vaultbox.ItemsSource = vltBitmapImage;

上記のコードを使用すると、この例外が発生します

'System.Invalid.Operation.Exception ItemsSourceを使用する前に、Itemsコレクションを空にする必要があります'

メディアライブラリからリストボックスに写真を表示しているものとほぼ同じコードである理由がわかりません。

上記の同様のリストボックスからも異なりますが、ファイルをisolatedstorageに保存しようとしていますが、画像名を取得する方法を見つけているようです...ここを参照してください。現在「名前」を使用していますが、そのために何ができますか?

foreach (BitmapImage item in lstImageFromMediaLibrary.SelectedItems)
{     
    string filepath =System.IO.Path.Combine("images", "name");
    IsolatedStorageFileStream ifs = fileStorage.CreateFile(filepath);
            {
                var bmp = new WriteableBitmap(item);
                bmp.SaveJpeg(ifs,item.PixelWidth,item.PixelHeight,0,90);
            }

        }
4

2 に答える 2

0

MVVMパターンを使用することをお勧めします。ViewModelを作成し、コレクションプロパティを内部に配置します。また、このViewModelクラスに「selecteditem」プロパティがあり、の選択されたアイテムをListBoxそれにバインドすると非常に便利です。

画像アイテム表現を導入する必要があるようです。名前の付いた画像です。

public class ImageViewModel : ViewModelBase
{
    public ImageViewModel(string name, string image)
    {
        Name = name;
        Image = image;
    }

    // Name or Path? Please make the choice by yourself! =)
    public string Name { get; private set; }
    public BitmapImage Image { get; private set; }
}

ViewModelBaseクラス(INotifyPropertyChangedインターフェースを実装):

public abstract class ViewModelBase : INotifyPropertyChanged
{
    protected ViewModelBase()
    {
    }

    #region Implementation of INotifyPropertyChanged interface

    public event PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
        {
            var args = new PropertyChangedEventArgs(propertyName);
            handler(this, args);
        }            
    }

    #endregion
}

メイン(ルート)ビューモデル。

public class MainViewModel : ViewModelBase
{
    public MainViewModel()
    {            
        // Call this directly:
        // var images = LoadImages();
        // Images = images;

        // or bind the Command property of Button to the LoadImagesCommand.
        LoadImagesCommand = new RelayCommand((param) => 
            {
                var images = LoadImages();
                Images = new ObservableCollection<ImageViewModel>(images);
            });
    }

    private ObservableCollection<ImageViewModel> _images;
    public ObservableCollection<ImageViewModel> Images
    {
        get { return _images; }
        private set
        {
            if (value == _images)
                return;
            _images = value;
            RaisePropertyChanged("Images");
        }
    }

    private ImageViewModel _selectedImage;
    public ImageViewModel SelectedImage
    {
        get { return _selectedImage; }
        set
        {
            if (value == _selectedImage)
                return;
            _selectedImage = value;
            RaisePropertyChanged("SelectedImage");
        }
    }

    public ICommand LoadImagesCommand { get; private set; }

    private List<ImageViewModel> LoadImages()
    {
        List<ImageViewModel> images = new List<ImageViewModel>();

        // Part of the original code.
        foreach (string fileName in fileStorage.GetFileNames("images//*.*"))
        {
            if (fileName == null)
                break;
            string filepath = System.IO.Path.Combine("images", fileName);
            using (IsolatedStorageFileStream imageStream = fileStorage.OpenFile(filepath,FileMode.Open,FileAccess.Read))
            {
                var imageSource = PictureDecoder.DecodeJpeg(imageStream);
                BitmapImage bitmapImage = new BitmapImage();
                bitmapImage.SetSource(imageStream);

                ImageViewModel imageViewModel = new ImageViewModel(fileName, bitmapImage);
                images.Add(imageViewModel);
            }
        }
    }
}

窓。

public class MainView : Window
{
    public MainView()
    {
        InititializeComponent();
        // It is just for simplicity. It would be better to use MVVM Light framework: ViewModel Locator!
        DataContext = new MainViewModel();
    }
}

XAML:

<!-- Please correct the binding for the Image property inside the ItemStyle -->
<ListBox Name="vaultbox"
         ItemsSource="{Binding Images}"
         SelectedItem={Binding SelectedImage}"
         ItemContainerStyle="{StaticResource ListBoxItemStyle1}"
         Height="493"
         HorizontalAlignment="Left"
         Margin="0,0,0,0"
         VerticalAlignment="Top"
         Width="442"
         SelectionMode="Multiple">
    ...
</ListBox>

また、非同期読み込みを検討してください。UIがフリーズすることはありません。

于 2012-10-06T19:42:05.430 に答える
0

次の行が原因で例外が発生します。

  <TextBlock Text="It is so lonely here..." />

ListBoxの子があります。そして、さらに追加しようとします。

于 2012-10-06T19:45:40.857 に答える