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 :

XAMLReader.Load() et XAML code-behind.


Sujet :

Windows Presentation Foundation

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut XAMLReader.Load() et XAML code-behind.
    Bonjour à tous,

    Je travaille en ce moment sur le chargement dynamique d'un fichier XAML grâce à la méthode XAMLReader.Load() mais un problème (problème tout a fait logique...) survient lorsque ce fichier XAML possède du code-behind... (par example avec x:Class).

    Etant donné que le XAML n'est pas compilé je ne peux pas faire de référence de ce genre, et mon XAMLReader me retourne une exception.

    A savoir que les controls définis dans ce fichier XAML sont initiallement vide de toutes données (par example grille totallement vide). Je dois donc parcourir le fichier XAML, trouver les controls, les initialiser et mettre a jour mon interface utilisateur (c'est d'ailleurs pour cela que j'utilisais XAMLReader.Load()).

    Malheureusement je n'ai aucune idée pour contourner ce problème, peut-être en avez vous ?

    Par avance, merci !
    Sacoum.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    tu peux toujours compiler dynamiquement le code behind, en utilisant le namespace System.CodeDom.Compiler

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Je ne suis pas sûr qu'en compilant dynamiquement le code-behind, mon problème sera réglé.

    L'exception retournée étant:
    "'Class' attribute does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml' namespace."

    Je pense que XAMLReader.Load n'accepte tout simplement pas cet attribut et que la compilation du code-behind ne changera pas. Non ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Essaie avec la surcharge de XamlReader.Load qui prend en paramètre un Stream et un ParserContext. Dans le ParserContext, tu peux spécifier les namespaces

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    J'avais déjà été confronté à ce genre de problème sans trouver de solutions

    A partir du moment où il y a x:Class, il est nécessaire d'avoir un fichier de code behind mais via le XamlReader, ca ne passe pas.
    Sans mettre le x:Class, ca marche mais dans ce cas, il est nécessaire d'accéder à chacun des objets du XAML, une fois compilé, pour s'abonner aux évènements.....

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Je viens d'essayer avec le ParserContext, mais rien ne change. L'attribut "Class" ne passe pas.

    Je vais "re-expliquer" ma situation, peut-être que ce XAMLReader.Load() n'etait pas un bon départ (en tout cas le final est loupé ^^).

    J'ai initialement un fichier XAML qui décrit mon UI: quels controls seront affichés (boutons, grilles, textbox, etc...). Dans ce fichier XAML aucune donnée n'est présente c'est a dire que tous les champs sont vides (grilles vides, textbox vide, etc...). Lorsque mon appli se lance tous ces controls doivent être initialisés.

    Mon idée était donc de charger dynamiquement ce fichier XAML via XAMLReader.Load() et de parcourir l'objet retourné à partir de la racine, pour chaque control trouvé, l'initialiser, et mettre ainsi a jour l'objet initial et enfin l'afficher.

    Mais problème avec ce x:Class pour mes CustomControl.

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    j'ai une solution a te proposer mais je sais pas ce quelle vo
    tu bind l'ensemble des propriete sur un dictionnaire type empty (données vide mais presente pour la definition)
    des les merge dictionnary de ton apply
    puis tu charge un dictionnaire qui contient les données et tu le met en premiere position des merges directory
    (tu reprend le dico vide et tu affecte les valeurs)

    le binding va faire le reste

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par sacoum Voir le message
    Mon idée était donc de charger dynamiquement ce fichier XAML via XAMLReader.Load() et de parcourir l'objet retourné à partir de la racine, pour chaque control trouvé, l'initialiser, et mettre ainsi a jour l'objet initial et enfin l'afficher.
    Ca me semble pas mal comme idée

    Mais problème avec ce x:Class pour mes CustomControl.
    Tu as essayé enlevant cet attribut ?

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Ikeas: Pour être sincère je n'ai pas trop compris ta solution. Ce que tu expliques c'est de binder les controls a un dictionnaire vide, remplir ce dictionnaire avec mes données et grâce au binding, mes controles s'initialiseront ? Le probleme ce que je ne sais pas quels controls composent mon XAML. Il me faur premierement savoir les controls que le XAML va afficher, ensuite récuperer les bonnes données (associées à ces controls), et les initialiser.

    Thomas: Au début je n'avais pas besoin de cet attribut Class, et tout fonctionnait très bien. Mais lorsque je dois utiliser des controls ayant un comportant spécifiques définit dans mes classes (d'ou cette utilisation de l'attribut Class), ce ne passe plus.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    et si dans le dictionnaire tu mettait des template de representation ?
    qui utiliseraient des controls que tu connais

    ceci etant a mon avis si les controls sont dans un assembly qui n'est pas encore charger il faudrait aussi le charger dans le appdomain (d'ailleurs c'est peut etre une solution pour l'autre facon de faire)

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Je suis toujours sur mon problème mais j'ai trouvé un sujet similaire au mien sur le forum MSDN.

    A la place d'utiliser XAMLReader.Load() qui ne supporte pas x.Class, il est indiqué qu'il faut utiliser Application.LoadComponent(). Ce que je me suis empressé de faire.

    Ce Application.LoadComponent est censé me retourner exactement le meme objet que le XAMLReader.

    Mon code est donc identique à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    object ob = Application.LoadComponent(new Uri("test.xaml",System.UriKind.Relative));
    En revanche, je me retrouve encore avec une exception levée:

    Cannot locate resource "test.xaml"

    De plus, je n'ai pas trop compris le dernier message de cette discussion sur le forum MSDN, peut-etre que cela m'aiderait... ?

    Voici le lien de la discussion:
    Error When Loading XAML File in C# (forum MSDN)

    Sacoum.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Dans le dernier message, il dit que tu ne peux pas utiliser directement le nom de ton fichier XAML: il faut que tu passes par la syntaxe qu'il a donné:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.LoadComponent(new Uri("/NomDeTonProjet;component/ChildWindow.xaml", UriKind.Relative))

  13. #13
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Oh ok !

    Donc si je comprends bien, le but est de reprendre le systeme du chargement du BAML ?

    Ce LoadComponent() est la méthode utilisée dans g.cs et donc cela signifie que maintenant je dois compiler mon XAML ?

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Non, cette méthode est utilisé pour chargé un fichier XAML: http://msdn.microsoft.com/en-us/library/ms596996.aspx

    Un fichier BAML, ce n'est que du XAML compilé

  15. #15
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Ce LoadApplication devrait donc résoudre mon problème alors. Selon MSDN:

    "Loads a XAML file that is located at the specified uniform resource identifier (URI), and converts it to an instance of the object that is specified by the root element of the XAML file."
    Application.LoadComponent()

    Donc cette méthode retourne bien le même objet que le XAMLReader() mais est en plus censée accepter l'attribut x:Class (ce qui est parfait).

    Si cela charge juste le XAML, je peux alors placer ou je souhaite ce fichier dans le repertoire de mon projet, il suffit de respecter la sytaxe que tu m'a détaillé Thomas et cela devrait fonctionner...

    Or j'obtiens toujours ce Cannot locate resource "page.xaml"

    Projet LoadXAML.
    Ma syntaxe:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Uri uri = new Uri("/LoadXAML;component/page.xaml", UriKind.Relative);
    Object obj = Application.LoadComponent(uri);
    Mon fichier page.xaml se trouve dans le repertoire /LoadXAML

    Mais cela ne semble pas etre le bon emplacement...

  16. #16
    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
    Et ce fichier page xaml est bien inclut au projet ? (c'est à dire tu le vois bien dans l'explorer de solution de visual studio ?)

    Sinon je pense que pour le premier terme s'agit plutôt du nom de l'assembly que du nom de dossier en fait. (cf. http://msdn.microsoft.com/en-us/library/aa970069.aspx)
    Donc essaie de remplacer par quelque chose dans le genre :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Uri uri = new Uri("/nomDeLassembly;component/LoadXAML/page.xaml", UriKind.Relative);

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Citation Envoyé par binoo Voir le message
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Uri uri = new Uri("/nomDeLassembly;component/LoadXAML/page.xaml", UriKind.Relative);
    Oui, ca me semble mieux comme ca

  18. #18
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Il s'agit bien de l'assembly, mais rien ne change... toujours cette meme erreur.

    Ce que je trouve étrange ce que dans de nombreux examples, cette référence à l'assembly n'est pas souhaitée.

    Example MSDN:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Relative URI
    Uri relativeUri = new Uri("/File.xaml", UriKind.Relative);
    (http://msdn.microsoft.com/en-us/library/aa970069.aspx)

    Ou dans ce topic:
    OK I was finally able to load in a Xaml file from the same directory. Here is the code:

    object ob = Application.LoadComponent(new Uri("Window1.xaml", System.UriKind.RelativeOrAbsolute));
    Voici un lien qui explique assez bien comment cela est censé fonctionner:
    http://pavanpodila.spaces.live.com/b...9398!193.entry

    Or dans mon cas, mon fichier XAML se trouve dans la même assembly que mon programme, je ne suis donc pas censé faire cette relation entre assembly et fichier XAML dans le LoadComponent() ? Le problème ne serait il donc pas ailleurs ?

  19. #19
    Membre à l'essai
    Inscrit en
    Août 2006
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 39
    Points : 20
    Points
    20
    Par défaut
    Bon je viens de passer par un autre moyen (qui au final revient au meme...)

    Je compile mon fichier XAML en tant que DLL. Dans mon projet de démarrage, je charge l'assembly de la DLL, ensuite en respectant la syntaxe de la méthode LoadComponent(), j'arrive a lire mon fichier XAML, aucune exception n'est levée et j'obtiens le meme objet qu'avec XAMLReader().

    Donc tout est parfait

    Merci à vous.
    Sacoum

  20. #20
    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 Même soucis
    Bonjour,

    Comment avez-vous fait finalement ?

    J'ai le même soucis. Je souhaite charger dynamiquement un fichier xaml qui se trouve dans un répertoire mais pas dans ma solution Visual Sudio et pas moyen, j'obtiens le même message d'erreur comme quoi il n'arrive pas à localiser la ressource.

    Je viens de lire que vous y êtes arrivé en compilant le Xaml en Dll mais comment ?

    D'avance merci.
    FTERF.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. code XAML équivalent au code Behind d'un binding
    Par djmic dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 12/08/2011, 16h30
  2. XAML - Récupérer une instance créée en code-behind
    Par jacquesprogram dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 09/09/2009, 15h35
  3. WPF, Win32 app, XAML et code-behind?
    Par sacoum dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 27/05/2008, 10h06
  4. Réponses: 5
    Dernier message: 24/05/2005, 12h31
  5. [VB.NET] Création d'un tableau en code behind
    Par netr dans le forum ASP.NET
    Réponses: 6
    Dernier message: 11/05/2004, 10h02

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