Laden...

ListView mit Bildern - Problem mit offenem FileHandle

Erstellt von Max1809 vor 10 Jahren Letzter Beitrag vor 10 Jahren 671 Views
M
Max1809 Themenstarter:in
67 Beiträge seit 2011
vor 10 Jahren
ListView mit Bildern - Problem mit offenem FileHandle

Guten Abend zusammen,

ich komme nicht mehr weiter ... 🙁

Bitte um Hilfe!

In meiner Applikation habe ich eine "Bilderverwaltung" wo Bilder hinzugefügt und gelöscht werden können.

Dies habe ich als ListView deklariert und folgendermaßen sieht das XAML aus:

  <Window.Resources>

        <DataTemplate x:Key="ImageGalleryDataTemplate">
            <Grid>
                <Border BorderBrush="#FF3B332C" BorderThickness="3"  Width="100" Height="100" Padding="10" Margin="15" CornerRadius="10">
                    <!--Bind Image Path in Image Control-->
                    <Image Source="{Binding vollerPfad}" Stretch="Fill"  HorizontalAlignment="Center">
                        <!--View Large Image on Image Control Tooltip-->
                        <Image.ToolTip>
                            <Grid>
                                <Image Source="{Binding vollerPfad}" Stretch="Fill" HorizontalAlignment="Center" Height="200" Width="200"></Image>
                            </Grid>
                        </Image.ToolTip>
                    </Image>
                </Border>
            </Grid>
        </DataTemplate>

        <ItemsPanelTemplate x:Key="ImageGalleryItemsPanelTemplate">
            <!--Display Images on UniformGrid Panel-->
            <UniformGrid Columns="4" HorizontalAlignment="Left" VerticalAlignment="Top"/>
        </ItemsPanelTemplate>
    </Window.Resources>

    <Grid>
        <ListBox SelectionMode="Multiple" x:Name="lbImageGallery"  ItemsSource="{Binding BilderCollection}" ItemsPanel="{DynamicResource ImageGalleryItemsPanelTemplate}" ItemTemplate="{StaticResource ImageGalleryDataTemplate}" Margin="0,0,0,59"  IsHitTestVisible="True" SelectionChanged="lbImageGallery_SelectionChanged" Background="#FFFFE692">
...
        </ListBox>

Wie ihr seht, hole ich mir die einzelnen Bilder in der ListView über folgendes "Binding" her:

 <Image Source="{Binding vollerPfad}" Stretch="Fill" HorizontalAlignment="Center" Height="200" Width="200"></Image>

Das Problem ist, dass hier wohl ein FileHandle aufgemacht wird.

Wenn ich nun die Datei folgendermaßen löschen lassen will, kriege ich die Meldung, dass diese von einem anderen Prozess verwendet wird:

Zuerst entferne ich das Bild aus der ListView:

(this.lbImageGallery.ItemsSource as List<DTOBild>).Remove(ausgewaehltesItem);

                    this.lbImageGallery.Items.Refresh();

Und möchte dann eigentlich die Datei löschen:

// --- Prüfung ob Datei exisitiert ---
         if (File.Exists(Pfade.gebenPfad(Pfade.PfadeEnum.LOKAL_PFAD_BILDER) + file.Name ))
         {
             try
             {
                 File.Delete(Pfade.gebenPfad(Pfade.PfadeEnum.LOKAL_PFAD_BILDER) + file.Name);
                 lReturn = true;
             }
             catch (Exception ex)
             {
                 lReturn = false;
             }
         }
         else
         {
             lReturn = false; // datei nicht vorhanden
         }

Könntet ihr mir evtl. einen Rat geben?

PS: Folgende Fehlermeldung:

Fehlermeldung:
Der Prozess kann nicht auf die Datei "C:\ProgramData\app\cms\Bilder\Bild_Aussen.jpg" zugreifen, da sie von einem anderen Prozess verwendet wird.

M
Max1809 Themenstarter:in
67 Beiträge seit 2011
vor 10 Jahren

Lösung:

Ich habe nun eine Lösung für mein Problem!

Die ListView kriegt von mir nun nicht mehr einen Pfad des Bildes, sondern nur noch ein Bitmap übergeben.

Dadurch wird auf der eigentlichen Datei kein Handle aufgemacht und das Löschen funktioniert problemlos. 😁

Folgender Code enthält also nicht mehr "vollerPfad", sondern "bitmap" als Binding-Eigenschaft:

Alt:

 <Image Source="{Binding vollerPfad}" Stretch="Fill" HorizontalAlignment="Center" Height="200" Width="200"></Image>

Neu:

  <Image Source="{Binding bitmap}" Stretch="Fill" HorizontalAlignment="Center" Height="200" Width="250"></Image>

Beim Hinzufügen baue ich mir das Bitmap folgendermaßen auf:

dtoBild.vollerPfad = Pfade.gebenPfad(Pfade.PfadeEnum.LOKAL_PFAD_BILDER) + bild_server;

                            Uri src = new Uri(Pfade.gebenPfad(Pfade.PfadeEnum.LOKAL_PFAD_BILDER) + bild_server, UriKind.RelativeOrAbsolute);
                            BitmapImage small_image_bmp = new BitmapImage();
                   
                            small_image_bmp.BeginInit();
                            small_image_bmp.CacheOption = BitmapCacheOption.OnLoad;
                            small_image_bmp.UriSource = src;
                            small_image_bmp.EndInit();
                            small_image_bmp.Freeze();
                            dtoBild.bitmap = small_image_bmp;

                            this.listeBilder.Add(dtoBild);

Wichtig damit ist das "Freeze()" - damit gebe ich das Bitmap anderen Threads frei.