IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Faire le ménage avant de partir ("relacher" des sources et les effacer ensuite)!


Sujet :

Windows Presentation Foundation

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut Faire le ménage avant de partir ("relacher" des sources et les effacer ensuite)!
    J'ai donc une application qui utilise un système de "modèles".
    On peut les voir comme des "thèmes", c'est en fait toute l'interface de la fenêtre...dans un fichier Xaml qui est chargé au démarrage!
    Je ne veux pas que mes utilisateurs puissent (facilement) aller voir/modifier ces éléments.
    Je choisis donc (comme pour "Word", par exemple, donc les fichiers .docx sont en fait un .rar) de faire passer le fichier Xaml et les sources bitmaps nécessaires dans un fichier .zip (que je renommerai plus tard en quelque chose de moins "évident")
    ...et tout cela marche PARFAITEMENT !!

    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Imports System.IO
    Imports Ionic.Zip
    Class MainWindow
        ' Je spécifie le chemin vers le fichier .zip et le nom du thème
        Dim ThemeLink As String = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\myApplication\Theme\"
        Dim SelectedTheme As String = "theme1"
        Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
            ' Décompression du .zip, dans un dossier "Theme" situé au même niveau que l'application
            Try
                Using zip As ZipFile = ZipFile.Read(ThemeLink & SelectedTheme & ".zip")
                    zip.ExtractAll(Environment.CurrentDirectory & "\Theme", ExtractExistingFileAction.OverwriteSilently)
                End Using
            Catch ex1 As Exception
                '
            End Try
            ' Remplissage de l'interface grâce à la lecture du fichier xaml fraichement décompressé
            Dim GridUri As String = Environment.CurrentDirectory & "\Theme\theme.xaml"
            Dim fs As FileStream = New FileStream(GridUri, FileMode.Open, FileAccess.Read)
            Dim sri = TryCast(System.Windows.Markup.XamlReader.Load(fs), Grid)
            Me.Content = sri
            fs.Close()
        End Sub
    End Class

    OR, il y a dans ce dossier les images dont le fichier xaml à besoin, et qui sont référencées ainsi dans le fichier xaml:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <Image Source="pack://siteoforigin:,,,/Theme/image1.png"/>

    Le fichier xaml quand il est chargé, s'exécute et va chercher les éléments bitmaps dans le dossier qui été décompressé (le même que celui qui contient le xaml)

    Tout cela marche NICKEL!

    PROBLEME:
    Quand l'application va fermer, je voudrais effacer ce dossier "temporaire"!!!
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub MainWindow_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs) Handles Me.KeyDown
       If e.Key = Key.Escape Then
          System.IO.Directory.Delete(Environment.CurrentDirectory & "\Theme", True)
          Me.Close()
          Return
       End If
    End Sub
    Le fichier xaml s'efface bien volontier (il a été lu en mémoire puis "relaché")...mais il en va tout autrement pour les fichiers images, qui sont toujours considérés comme ouvert par l'application!!

    Auriez-vous une idée de comment je pourrais faire pour "relacher" l'utilisation des éléments bitmaps avant de quitter...de façon à pouvoir effacer ce dossier en toute tranquilité.
    Je vous le dit déja, le fait de "vider" la grille contenant tout les éléments, par un ne marche pas...enfin si, ca marche, mais tout va trop "vite" et les images ne sont pas "relachées" assez rapidement quand l'instruction Me.Close() arrive)

    Merci de m'avoir lu jusqu'ici (je me suis en échange appliqué pour être le plus clair possible ;-), merci de l'aide que vous voudrez bien m'accorder...j'en ai vraiment besoin là!! ;-)

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    A mon avis c'est la partie Render qui n'est pas rafraichie et donc il considère devoir encore garder le fichier en lock pour l'affichage.
    As-tu essayé de supprimer ton dossier temporaire avec un Dispatcher.BeginInvoke ?

    Et également, tu fais
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Content = new Grid()
    as-tu essayé (au moins pour tester) de parcourir ton Grid et d'enlever manuellement chaque contrôle Image des Children de celui-ci ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    J'ai fait des tests simples et effectivement ça me fait la même chose.

    Tu as toujours la solution de créer une liste statique de fichiers temporaires au lancement de ton appli (app.xaml.cs), d'alimenter cette liste au fur et à mesure (donc à faire en code behind), et à la sortie de ton appli (toujours dans le app.xaml.cs) tu fais un File.Delete de chacun de tes fichiers temporaires.

    Je pense que tout simplement, WPF conserve ton image en cache afin de ne pas avoir à la recharger complètement à la prochaine éventuelle utilisation.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    Voici une solution à base de Converter à appliquer sur ton image.

    Ca fonctionne nickel
    Fichiers attachés Fichiers attachés

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2006
    Messages : 158
    Points : 41
    Points
    41
    Par défaut
    marcusien,

    Merci beaucoup pour ta réponse..et pour le temp que tu y as consacré!!

    Je viens de découvrir un paramètre formidable, dont la fonction est exactement ce que je recherchais...et qui est donc d'une utilisation simplissime:

    Code xaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <Image.Source>
       <BitmapImage UriSource="pack://siteoforigin:,,,/Theme/back.jpg" CacheOption="OnLoad" />
    </Image.Source>

    Ce CacheOption="OnLoad" déverrouille l'utilisation du bitmap une fois chargé!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    351
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 351
    Points : 321
    Points
    321
    Par défaut
    C'est l'option qu'il y avait dans le converter

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment faire un test avant un FieldByName().value = ... ?
    Par fredfred dans le forum Bases de données
    Réponses: 13
    Dernier message: 19/09/2005, 11h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo