Laden...

BitmapImage blockiert File

Erstellt von NerdNet vor 2 Jahren Letzter Beitrag vor 2 Jahren 255 Views
N
NerdNet Themenstarter:in
1 Beiträge seit 2022
vor 2 Jahren
BitmapImage blockiert File

Hallo Zusammen,

ich sitze jetzt seid Tagen an einem eigentlich komplett banalem Problem.
WPF Fenster 1 öffnet ein weiteres Fenster in dem ich unter anderem eine Reihe von Bitmaps anzeige.
Durch Klick auf eines der Bitmaps öffnet sich ein weiteres Fenster (Fenster 3). Das Bitmap wird dabei NICHT übergeben.
Ich schließe Fenster 2 (.close). Weder Fenster 1 noch Fenster 3 sollten irgendetwas von den Bitmaps wissen.
Trotzdem bleiben alle Dateien aus welchen ich die Bitmaps generiert/geladen habe blockiert. Ich kann sie weder überschreiben noch sonst etwas.
Ich habe sogar schon Kopien der Dateien erstellt und dann nur diese Kopien geladen.... es bleibt das originalFile Blockiert.
Ich muss irgendwo ein riesen Brett vor dem Kopf haben.
Hier der Code mit dem ich die Bitmaps lade. Ich entschuldige mich für den wilden Code aber nach 2 Tagen herumprobieren bleibt die eine oder andere Leiche liegen.

Ich wäre wirklich für jeden Tipp/Hinweis dankbar


private BitmapImage readImageFromFile(string path)
        {
            BitmapImage myBitmapImage = new BitmapImage();

            myBitmapImage = trytoLoadAndDecode(path);

            //BitmapImage toReturn = new BitmapImage();
            //toReturn = myBitmapImage.Clone();
            myBitmapImage.StreamSource = null;
            GC.Collect();
            
            return myBitmapImage;
        }


 private BitmapImage trytoLoadAndDecode(string path)
        {
            //Eine Kopie erstellen
            
            //System.IO.File.Copy(path, copyPath, true);

            decodeFailed = false;
            BitmapImage myBitmapImage = new BitmapImage();

            using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read))
            {
                //var stream = File.OpenRead(path);
                myBitmapImage.BeginInit();
                myBitmapImage.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
                
                myBitmapImage.StreamSource = stream;
                //myBitmapImage.UriSource = new Uri(path);
                myBitmapImage.DownloadFailed += MyBitmapImage_DownloadFailed;
                myBitmapImage.DecodeFailed += MyBitmapImage_DecodeFailed;

                //myBitmapImage.DecodePixelWidth = 200;
                myBitmapImage.EndInit();
                
                stream.Close();
                stream.Dispose();
            }

            
            if (decodeFailed)
            {
                myBitmapImage = trytoLoadAndDecode(path);
            }
            else
            {
                return myBitmapImage;
            }

            return null;
        }


private void getNewZeichnungenOfPatient()
        {
            if (Zeichnungen == null)
            {
                Zeichnungen = new List<ExtendedZeichnungen>();
            }
            List<int> allId = new List<int>();
            if (ckId != 0)
            {
                using (var con = new PlhDataEntities())
                {
                    List<LaborzeichnungDB> alleZeichnungenDesPatienten = new List<LaborzeichnungDB>();
                    List<LaborzeichnungDB> sortList = new List<LaborzeichnungDB>();
                    sortList = con.LaborzeichnungDB.Where(l => l.ckPatientID == ckId).ToList();
                    alleZeichnungenDesPatienten = sortList.OrderByDescending(o => o.datum).ToList();
                    if (alleZeichnungenDesPatienten.Count > 0)
                    {
                        foreach (LaborzeichnungDB current in alleZeichnungenDesPatienten)
                        {
                            BitmapImage currentImage;
                            string fullPath = serverPath + current.id.ToString() + ".jpg";
                            copyPath = copyServerPath + current.id.ToString() + ".jpg";
                            if (File.Exists(fullPath))
                            {
                                currentImage = readImageFromFile(fullPath);
                            }
                            else
                            {
                                currentImage = null;
                            }

                            string pfad = "";
                            if (currentImage != null)
                            {
                                //pfad = currentImage.UriSource.OriginalString;
                                pfad = fullPath;
                            }
                            ExtendedZeichnungen newZeichnung = new ExtendedZeichnungen(currentImage, current.datum ?? DateTime.Now, current.id, pfad);
                            Zeichnungen.Add(newZeichnung);
                            //allId.Add(current.id);
                        }
                    }
                }
            }
        }

16.828 Beiträge seit 2008
vor 2 Jahren
G
154 Beiträge seit 2015
vor 2 Jahren

Wenn Du das sowieso aus einer Datei lädst, sollte das eigentlich mit .BeginInit(), BitmapCacheOption.OnLoad und .EndInit() gehen, wenn Du die .UriSource setzt.