Laden...

ImageBinding und dabei File Lock verhindern (UWP)

Erstellt von Bobby vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.010 Views
B
Bobby Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren
ImageBinding und dabei File Lock verhindern (UWP)

Hallo liebe Mitglieder,

ich bin neu im Thema UWP und App-Programmierung, habe mir hier mal die Regeln zu Gemüte geführt und hoffe, dass ich nicht all zu viel falsch mache!

Mein Problem:
Ich habe eine Liste von Personen, denen ich Bilder zugeordnet habe. Diese Bilder liegen physisch im "LocalState"-Ordner der App und sollen in der Personen-Übersicht angezeigt werden. Dazu habe ich in meinem Template ein Image-Element, an dessen Source-Eigenschaft ich den Pfad binde. Das Bild wird auch angezeigt. Ich kann es zur Laufzeit der App allerdings nicht ändern - das möche ich beheben.

Frage
Nun ist die Frage, ob es eine Möglichkeit gibt in der Person-Klasse ein asynchrones Attribut anzulegen, welches mir zum einen die das Image-Element befüllt und dabei aber die physische Datei nicht blockiert. Ich habe schon im Netz gesucht aber so richtig fündig bin ich dabei nicht eworden bzw. habe massive Probleme den Sachverhalt zu verstehen.

Ich bedanke mich schon vorab für die Hilfe und wünsche allen einen sonnigen Tag!

16.842 Beiträge seit 2008
vor 5 Jahren

Da wir nicht sehen, wie Du auf die Datei zugreifst, müssen wir raten.

Ich nehme an, dass Du das Bild bzw. dessen Ressourcen direkt an ein UI-Element bindest.
Damit bleibt natürlich der Stream offen und die Datei ist gesperrt.

Willst Du das nicht, dann musst Du den Inhalt des Bilds in den RAM schieben, und aus dem RAM verlinken.
Mehr bleibt hier nicht.

B
Bobby Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

Lieber Abt,

das Source-Element bekommt den direkten Pfad, ja.

Deine Lösung klingt interessant, hättest du ein Beispiel dafür?

16.842 Beiträge seit 2008
vor 5 Jahren

Sicher, ganz einfach über die Forensuche, hättest auch einfach selbst suchen können.
[Hinweis] Wie poste ich richtig?

Bitmap öffnen ohne Datei zu sperren

B
Bobby Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

Hallo und nochmal vielen Dank für die Hilfe!
Nach ein wenig probieren und Recherche habe ich nun eine für mich sinnvolle Lösung gefunden.


        /// <summary>
        /// Generate In-Memory ImageSource of Thumbnail
        /// </summary>
        /// <returns></returns>
        private async Task<ImageSource> GenerateThumbnailSource()
        {
            ImageSource result = null;

            try
            {
                StorageFolder folder = await ApplicationData.Current.LocalFolder.GetFolderAsync(this.folder);
                StorageFile file = await folder.GetFileAsync(this.filename);

                using (var randomAccessStream = await file.OpenAsync(FileAccessMode.Read))
                {
                    var buffer = new BitmapImage();
                    await buffer.SetSourceAsync(randomAccessStream);
                    result = buffer;
                }
            }
            catch (Exception)
            {
                result = null;
            }

            return result;
        }

Das ganze lege ich mir in eine Property der Klasse und hole die mit den nötigen "OnPropertyChanges" ab.

Einen schönen sonnigen Tag wünsche ich!