Располагая общим списком растровых изображений - PullRequest
2 голосов
/ 27 декабря 2011

Как я могу расположить все изображения в общем списке в WPF?

Вот моя попытка:

//piclist is a global variable pointing to a folder on harddrive 
foreach (string s in this.piclist)  
{
   this.picsToDisplay.Add(this.BitmapFromUri(new Uri(s)));
}

private BitmapImage LoadImage(string myImageFile)
    {
        BitmapImage myRetVal = null;
        if (myImageFile != null)
        {
            BitmapImage image = new BitmapImage();
            using (FileStream stream = File.OpenRead(myImageFile))
            {
                image.BeginInit();
                image.CacheOption = BitmapCacheOption.OnLoad;
                image.StreamSource = stream;
                image.EndInit();
            }
            myRetVal = image;
        }
        return myRetVal;
    }

и вот как я очищаю и удаляю все:

if (this.picsToDisplay.Count > 0)
        {
            foreach (BitmapImage b in this.picsToDisplay)
                b.StreamSource.Dispose();

            this.picsToDisplay.Clear();
        }

        Array.ForEach(Directory.GetFiles(this.tempPics),
                        delegate(string path) { File.Delete(path); });

Сначала происходит сбой при b.StreamSource.Dispose(); Сказать, что streamsource is null 'ссылка не установлена ​​на экземпляр объекта'

Если я закомментирую эту строку, она вылетит в этой части: File.Delete(path); С сообщением о том, что изображение, которое я пытаюсь удалить, используется.

Изображения, отображаемые в элементе управления изображением в WPF.Его источник уже установлен в NULL, прежде чем я приступлю к утилизации и т. Д.

Что мне не хватает, ребята?

=========== EDIT

private void btnLoadPictures_Click(object sender, EventArgs e)
{
    this.ClearPicturesFromList();
    DirectoryInfo Dir = new DirectoryInfo(this.pictures);
    List<string> stringList = new List<string>();
    FileInfo[] picList = Dir.GetFiles();

    stringList = (from FI in picList
         where FI.LastWriteTime.Date.ToString("dd-MM-yyyy") == 
         this.dpPictureDate.SelectedDate.Value.ToString("dd-MM-yyyy")
         select (FI.FullName)).ToList();

try
{
if (Directory.Exists(this.tempPics))
{
    if (stringList.Count > 0)
    {
        foreach (string s in stringList)
        {
            string destFolder = System.IO.Path.Combine(this.tempPics, System.IO.Path.GetFileName(s));
            File.Copy(s, destFolder, true);
        }

        DirectoryInfo Dir2 = new DirectoryInfo(this.tempPics);
        FileInfo[] pics = Dir2.GetFiles();

        this.picsInTempFolder = (from FI in pics
                            select (FI.FullName)).ToList();

        foreach (string s in this.picsInTempFolder)
        {
            this.picsToDisplay.Add(this.LoadImage(s));
        }

        this.indexCounter = 0;
        this.imgBox.Source = (BitmapImage)this.picsToDisplay[this.indexCounter];
        this.tbxPictureName.Text = System.IO.Path.GetFileName(this.picsInTempFolder[this.indexCounter]);
        stringList.Clear();
        pics = null;
        }
    }
}

catch (Exception exp)
{
    this.WriteToRichTextBox(exp.ToString());
}

} ​​

при первом нажатии кнопки clearimages я получаю исключение относительно используемого файла.делать это во второй раз, на самом деле работает нормально.

Помещение thread.sleep между очисткой всех списков и прочим, чем удаление файлов из временного каталога, не работает.но так или иначе это требует своего рода задержки.

1 Ответ

1 голос
/ 27 декабря 2011

попробуйте этот метод для загрузки изображений

 private BitmapImage LoadImage(string myImageFile)
        {
            BitmapImage myRetVal = null;
            if (myImageFile != null)
            {
                BitmapImage image = new BitmapImage();
                using (FileStream stream = File.OpenRead(myImageFile))
                {
                    image.BeginInit();
                    image.CacheOption = BitmapCacheOption.OnLoad;
                    image.StreamSource = stream;
                    image.EndInit();
                }
                myRetVal = image;
            }
            return myRetVal;
        }
...