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 :

Chargement dynamique d'un fichier .xaml


Sujet :

Windows Presentation Foundation

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Points : 101
    Points
    101
    Par défaut Chargement dynamique d'un fichier .xaml
    Bonjour,

    Après recherches je n'ai pas trouvé de réponses sur les forums et vu que le Framework a encore évolué, voici mon soucis :

    Dans mon application WPF, j'aimerais charger un fichier .xaml dynamiquement (ce fichier contient un StackPanel avec des contrôles).
    Le fichier .xaml n'est pas dans la solution Visual Studio. Je l'ai créé avec Bend et il est stocké dans un répertoire spécifique.

    Donc, avec le bout de code suivant (VB.NET) :

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim ResLocatator As New System.Uri("testload.xaml", System.UriKind.Relative)
    Dim StackP As StackPanel
     
    StackP = Application.LoadComponent(ResLocatator)
    Me.Content = StackP

    Si le fichier testload.xaml est dans la solution, aucun problème. Par contre, si il se trouve quelque part sur le disque, alors il me dit qu'il n'arrive pas à localiser la ressource testload.xaml.

    J'ai lu quelque part que c'est parce que le fichier en question n'est pas compilé et qu'il y a moyen de le compiler au runtime.

    Avez-vous une idée ?

    D'avance merci.
    FTERF.

  2. #2
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    En créant l'URI tu peux spécifier soit une ressource localisée relativement au répertoire actif (ce qui est le cas dans ton code), soit un chemin absolu, ou encore une ressource située dans un assembly (avec la syntaxe "pack://...").
    Des exemples sur ce dernier cas:
    http://msdn.microsoft.com/fr-fr/library/aa970069.aspx

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Points : 101
    Points
    101
    Par défaut
    Ok merci.

    Donc je suppose que dans mon code :

    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim resLocator As New System.Uri("pack://LoadXaml:,,,/testload.xaml", UriKind.Absolute)
     
    Dim StackP As StackPanel
    StackP = Application.LoadComponent(resLocator)
    Me.Content = StackP

    Il me dit qu'il ne peut pas utiliser le type de localisation 'Absolute'. (avec relative il ne sait pas localiser la ressource, ce qui est normal)

    Tu aurais un exemple sous la main ?
    Et si il y du codebehind dans le fichier Xaml en question, est-il possible de gérer les événements associés dans la fenêtre qui charge le fichier xaml ?

    Encore merci.
    FTERF.

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par fterf
    Et si il y du codebehind dans le fichier Xaml en question, est-il possible de gérer les événements associés dans la fenêtre qui charge le fichier xaml ?
    Non, pas à ma connaissance.

    ps: pense au balises CODE (le "#" dans la toolbar des messages)

  5. #5
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Tu dois pouvoir charger le fichier avec son chemin sur le disque comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Uri("file:///chemi_complet")
    Où le troisième '/' après 'file:' spécifie l'ordinateur local comme racine ; si ton fichier est une ressource d'un assembly de la solution en cours, tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Uri(string.Format("pack://application:,,,/{0};component/{1}", Assembly.GetExecutingAssembly().GetName().Name, chemin_du_fichier_dans_l_assembly), UriKind.Absolute)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Points : 101
    Points
    101
    Par défaut
    Le problème c'est que en utilisant cette syntaxe, la ligne suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.LoadComponent(resLocator)
    Renvoie une erreur du type : 'Impossible de charger un URI absolu'.

    Ou alors, il faut utiliser autre chose que LoadComponent...

  7. #7
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    et avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri("file:///...") } );
    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StackPanel sp = (StackPanel)Application.Current.Resources.FindName("leNomDeMonStackPanel");

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Points : 101
    Points
    101
    Par défaut
    Il mentionne que ' Le préfixe URI n'est pas reconnu'.

    Il me semble que c'est parce qu'il manque un espace de noms dans le xaml non ?
    Reste plus qu'à trouver lequel...

    Merci.

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par fterf Voir le message
    Il mentionne que ' Le préfixe URI n'est pas reconnu'.
    Tu as mis quoi dans ton URI ? Montre nous ton code

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Points : 101
    Points
    101
    Par défaut
    Bonjour à tous,

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim rd As New ResourceDictionary()
    Dim resLocator = New System.Uri("pack://LoadXaml:,,,/testload.xaml", UriKind.Absolute)
    rd.Source = resLocator
    Application.Current.Resources.MergedDictionaries.Add(rd)
    StackP = CType(Application.Current.Resources.FindName("spload"), StackPanel)
    Me.Content = StackP
    Le fichier testload.xaml est donc localisé dans le répertoire de l'exécutable de l'application (mais pas ajouté à la solution). Dans ce fichier, un StackPanel nommé spload qui contient un bouton et une checkbox. En voici le code XAML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <StackPanel x:Class="testload"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="285" Width="587" Name="spload">
        <Grid Name="Grid1">
            <Label Height="28" HorizontalAlignment="Left" Name="lblDsn" VerticalAlignment="Top" Width="140">Source de données</Label>
            <TextBox Height="22" Margin="146,2,112,0" VerticalAlignment="Top" Name="txtDsn"/>
            <Label Height="28" HorizontalAlignment="Left" Margin="0,29,0,0" VerticalAlignment="Top" Width="171" Name="lblUid">Nom d'utilisateur</Label>
            <TextBox Height="22" Margin="146,30,263,0" VerticalAlignment="Top" Name="txtUid"/>
            <Label Height="28" HorizontalAlignment="Left" Margin="0,56,0,0" VerticalAlignment="Top" Width="171" Name="lblPwd">Mot de passe</Label>
            <PasswordBox Height="22" Margin="146,58,263,0" VerticalAlignment="Top" Name="txtPwd"/>
        </Grid>
    </StackPanel>
    Si la localisation du fichier est effectuée via la syntaxe "file:///..." cela pose le même problème.

    En fait, j'ai écrit une classe en C# qui permet d'analyse un fichier XAML et de recomposer une fenêtre sur base de celui-ci en gérant les propriétés et événements des différents contrôles. Mais dans cette classe je suis obligé de parcourir tous les noeuds XML et de les traiter, et du coup je dois jouer avec des données stockées dans le tag des contrôles donc c'est pas génial. Je me dis donc que si des fonctions existent déjà pour faire cela et peut-être pour traiter un éventuel code behind, ça serait plus simple.

    Encore merci pour votre aide ^^

    FTERF.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Points : 101
    Points
    101
    Par défaut
    Oui dans le fichier XAML il y a un peu plus qu'un bouton et une checkbox

    Merci.

  12. #12
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Citation Envoyé par fterf
    Je me dis donc que si des fonctions existent déjà pour faire cela et peut-être pour traiter un éventuel code behind, ça serait plus simple.
    Une autre méthode serait de faire une dll de ton code xaml et c# / vb associé et d'utiliser la réflexion. Parce que là t'es pas arrivé si tu veux analyser (parser) tes fichiers xaml et compagnie...

  13. #13
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par fterf Voir le message
    Le fichier testload.xaml est donc localisé dans le répertoire de l'exécutable de l'application (mais pas ajouté à la solution).
    Ca doit etre ca le pb. La syntaxe pack://... c'est pour les fichiers qui sont dans la solution. Essaye ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim rd As New ResourceDictionary()
    Dim resLocator = New System.Uri("testload.xaml", UriKind.Absolute)
    rd.Source = resLocator
    Application.Current.Resources.MergedDictionaries.Add(rd)
    StackP = CType(Application.Current.Resources.FindName("spload"), StackPanel)
    Me.Content = StackP
    Là, il va regarder si dans le répertoire de ton exécutable se trouve le fichier testload.xaml

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2006
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2006
    Messages : 59
    Points : 101
    Points
    101
    Par défaut
    Bonjour,

    Il me retourne à présent ce message. C'est capricieux ces bêtes là

    URI non valide : Impossible de déterminer le format de l'URI.

    Merci.

  15. #15
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Et avec ca ?

    Dim resLocator = New System.Uri("testload.xaml", UriKind.Relative)

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2015, 17h51
  2. [C#] Static Resource introuvable avec un chargement dynamique de XAML
    Par harrylahache dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 16/09/2011, 14h46
  3. Comment charger dynamiquement des fichier XAML ?
    Par AliJava dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 09/10/2009, 16h45
  4. Chargement dynamique de XAML
    Par Tod_sd dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 01/04/2009, 11h38
  5. Chargement dynamique d'un fichier VBA
    Par ci0420 dans le forum Word
    Réponses: 2
    Dernier message: 16/10/2007, 08h00

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