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 :

[WPF] Image et assembly


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut [WPF] Image et assembly
    Bonsoir à tous,

    j'ai un problème de binding image un peu complexe

    Voila l'organisation de mon projet :
    - Une DLL contenant une classe Plugin.
    - Une DLL contentnat une classe hérités de Plugin.
    - Un exécutable Interface.exe qui charge dynamiquement les plugins.

    Ma classe plugin contient entre autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
            #region Image
            public BitmapImage Image 
            {
                get
                {
                    return (this._Image);
                }
                set
                {
                    this._Image = value;
                    this.OnPropertyChanged("Image");
                }
            }
            private BitmapImage _Image = null;
            #endregion
    Dans le constructeur de ma classe hérité j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    this.Status = MenuButton.StatusType.Disconnected;
                this.Image = new BitmapImage(new Uri("/Ressources/Image.png", UriKind.Relative));
    Le problème :
    Dans l'exécutable je bien des champs sur la classe hérité de Plugin, le texte et autres propriété fonctionne, j'ai cependant un problème par rapport à l'image, l'image est contenu dans la DLL et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Image = new BitmapImage(new Uri("/Ressources/Image.png", UriKind.Relative));
    ne fonctionne pas, comment puis-je faire ?

    Merci d'avance.

    Cordialement,
    NeoKript

  2. #2
    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
    Par défaut
    Salut,

    Essaies avec cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Image = new BitmapImage(new Uri("pack://application:,,,/ReferencedAssembly;component/Ressources/Image.png"));
    Pour plus d'information sur la création de cette URI voir la doc msdn :
    http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

    Il faut aussi penser à définir ton image comme une ressource (clic droit sur l'image -> propriété -> build action = Resource)

  3. #3
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Citation Envoyé par binoo Voir le message
    Salut,

    Essaies avec cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Image = new BitmapImage(new Uri("pack://application:,,,/ReferencedAssembly;component/Ressources/Image.png"));
    Pour plus d'information sur la création de cette URI voir la doc msdn :
    http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx

    Il faut aussi penser à définir ton image comme une ressource (clic droit sur l'image -> propriété -> build action = Resource)
    Salut, Merci pour ta réponse.
    L'image est déjà en ressource.

    J'avais déjà test ceci, mais ca ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Image = new BitmapImage(new Uri("pack//application:,,,/Desktop;component/Ressources/Image.png", UriKind.Relative));
    Edit :
    Je tiens à préciser que la dll est charger dynamiquement par réflexion et non référencé dans le projet.

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

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    La DLL que tu charges s'appelle Desktop ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    La DLL que tu charges s'appelle Desktop ?
    Salut, Desktop c'est le nom du namespace de la DLL que je charge dynamiquement.

    Mais sur MSDN, ils disent qu'on peut faire cela pour des assembly référencées or quand on charge dynamiquement, l'assembly n'est pas référencée non ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Voilà le code complet au cas ou :

    Plugin.dll

    Code : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    public class Plugin : ViewModelBase
        {
            #region Name
            private String _Name = "Plugin";
            public String Name 
            {
                get
                {
                    return (this._Name);
                }
                set
                {
                    this._Name = value;
                    this.OnPropertyChanged("Name");
                }
            }
            #endregion
            #region Image
            public BitmapImage Image 
            {
                get
                {
                    return (this._Image);
                }
                set
                {
                    this._Image = value;
                    this.OnPropertyChanged("Image");
                }
            }
            private BitmapImage _Image = null;
            #endregion
            #region Notification
            private Int32 _Notification = 0; 
            public Int32 Notification 
            {
                get
                {
                    return (this._Notification);
                }
                set
                {
                    this._Notification = value;
                    this.OnPropertyChanged("Notification");
                }
            }
            #endregion
            #region Status
            private MenuButton.StatusType _Status = MenuButton.StatusType.None;
            public MenuButton.StatusType Status 
            {
                get
                {
                    return (this._Status);
                }
                set
                {
                    this._Status = value;
                    this.OnPropertyChanged("Status");
                }
            }
            #endregion
    }
    Cinema.dll
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Cinema : Plugin
        {
            public Entry()
            {
                this.Name = "Cinéma";
                this.Status = MenuButton.StatusType.Disconnected;
                this.Image = new BitmapImage(new Uri("pack//application:,,,/Cinema;component/Ressources/Cinema.png", UriKind.Relative));
            }
     
        }
    Interface.exe
    Code : 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
    24
    25
    26
    27
    28
    29
     
    public void LoadPlugins()
    {
    DirectoryInfo Dir = new DirectoryInfo(Directory.GetCurrentDirectory());
                String Content = String.Empty;
                foreach (FileInfo File in Dir.GetFiles("*.Plugin.dll"))
                {
                    Assembly Assemb = Assembly.LoadFrom(File.FullName);
                    foreach (Type Type in Assemb.GetTypes())
                    {
                        object Object = Assemb.CreateInstance(Type.FullName);
                        Plugin Plugin = Object as Plugin;
                        if (Plugin != null)
                        {
                            MenuButton MB = new MenuButton();
                            MB.DataContext = Plugin;
                            Binding BindingName = new Binding("Name");
                            MB.SetBinding(MenuButton.TextProperty, BindingName);
                            Binding BindingImage = new Binding("Image");
                            MB.SetBinding(MenuButton.ImageProperty, BindingImage);
                            Binding BindingNotification = new Binding("Notification");
                            MB.SetBinding(MenuButton.NotificationProperty, BindingNotification);
                            Binding BindingStatus = new Binding("Status");
                            MB.SetBinding(MenuButton.StatusProperty, BindingStatus);
                            this.Stack.Children.Add(MB);
                        }
                    }
                }
            }
    Voilà donc Cinema.dll est charger dynamiquement par interfaces.exe et Plugin.dll est référencé dans cinema.dll et Interface.exe.

  7. #7
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Autres infos, quand j'exécute le code suivant depuis la dll, j'ai une exception dans l'image System.Io.Exception, ressources not found

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Button.Image = new BitmapImage(new Uri("pack//application:,,,/Cinema;component/Ressources/Cinema.png", UriKind.Relative));


    Alors que quand dans la DLL je fait une fenetre xaml et que je met une image avec Source="Ressources/Cinema.png", cela fonctionne !

  8. #8
    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
    Par défaut
    Ça fonctionne également en chargeant la librairie dynamiquement. La ligne suivante que tu utilises suffit à charger l'assembly à ton projet :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Assembly Assemb = Assembly.LoadFrom(File.FullName);


    Après, essaies avec la syntaxe que je t'ai donné (les deux points ':' sont nécessaires derrière pack), soit :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Button.Image = new BitmapImage(new Uri("pack://application:,,,/Cinema;component/Ressources/Cinema.png"));
    Pour le UriKind.Relative, je me demande si ce n'est pas plutôt Absolute qu'il faudrait mettre. Essaies sans rien et si ça ne fonctionne pas essaies avec les différentes valeurs possibles.

    Sinon vérifies bien que ton images "Cinema.png" est dans un dossier "Ressources". Que ce dossier "Ressources" est bien présent (dans l'explorer de solution) dans le projet dll qui va bien, soit le projet de namespace "Cinema".

  9. #9
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Citation Envoyé par binoo Voir le message
    Ça fonctionne également en chargeant la librairie dynamiquement. La ligne suivante que tu utilises suffit à charger l'assembly à ton projet :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    Assembly Assemb = Assembly.LoadFrom(File.FullName);


    Après, essaies avec la syntaxe que je t'ai donné (les deux points ':' sont nécessaires derrière pack), soit :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Button.Image = new BitmapImage(new Uri("pack://application:,,,/Cinema;component/Ressources/Cinema.png"));
    Pour le UriKind.Relative, je me demande si ce n'est pas plutôt Absolute qu'il faudrait mettre. Essaies sans rien et si ça ne fonctionne pas essaies avec les différentes valeurs possibles.

    Sinon vérifies bien que ton images "Cinema.png" est dans un dossier "Ressources". Que ce dossier "Ressources" est bien présent (dans l'explorer de solution) dans le projet dll qui va bien, soit le projet de namespace "Cinema".
    Qu'en je met pack: (en rajoutant les : quoi) ca pète (XamlParseExeption), qu'en j'enlève UriKind.Relative, j'ai la même exception.

    Sinon le fichier Cinema.png se trouve bien au bon endroit dans la solution de la dll Cinema...

    Je commence à désespérer :s

    Merci pour ton aide

  10. #10
    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
    Par défaut
    Je sèche. Essaie de mettre un projet light en pièce jointe.

  11. #11
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Voila je t'ai mis le code qui ne fonctionne pas en pièce jointe (Projet VS 2010)!

    Merci pour ton aide, ca serais chouette si tu trouvais, déjà 2 jours que je bloque.

    Cordialement,
    NeoKript

  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
    Par défaut
    Je n'ai pas de poste avec Visual Studio 2010 sous la main . D'autres pourront peut-être tester.

  13. #13
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Et voila la version VS 2008 ^^

    SUr dl.free du coup (taille pièce jointe dépassée)
    http://dl.free.fr/hI0akLepO

  14. #14
    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
    Par défaut
    Ok.

    Donc dans le projet 2008, l'image n'est pas en tant que Resource (clic droit sur l'image -> propriété -> build action = Resource) comme je l'avais dit avant. Mais c'est peut-être du à la reprise du projet pour 2008...

    Sinon il faut mettre cette ligne :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.Image = new BitmapImage(new Uri("pack://application:,,,/Cinema.Plugin;component/Ressources/Cinema.png"));

    La raison : Cinema.Plugin est le nom de l'assembly de ton plugin (clic droit sur ton projet Cinema -> Propriété -> onglet Application -> "Nom de l'assembly")

  15. #15
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    En effet, cela fonctionne, j'ai du mal à comprendre pourquoi on doit rajouter .Plugin, si tu pouvais m'éclairer sur ce point histoire que je t'embête pas la prochaine foi que j'ai un problème de ce genre ^^

    Cela vient du faite que j'hérite de plugin ?

    Merci encore.

  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
    Par défaut
    Dans le lien msdn fournit précédemment, tu peux voir que pour la création du path, il faut fournir l'AssemblyShortName. Or toi tu as mis Cinema.Plugin (voir mon post précédent)

    C'est le nom de ta dll en fait
    Si tu veux changer ce nom tu peux le faire via la manip que j'ai décrite dans le message précédent (clic droit sur ton projet Cinema -> Propriété -> onglet Application -> "Nom de l'assembly").

  17. #17
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Citation Envoyé par binoo Voir le message
    Dans le lien msdn fournit précédemment, tu peux voir que pour la création du path, il faut fournir l'AssemblyShortName. Or toi tu as mis Cinema.Plugin (voir mon post précédent)

    C'est le nom de ta dll en fait
    Si tu veux changer ce nom tu peux le faire via la manip que j'ai décrite dans le message précédent (clic droit sur ton projet Cinema -> Propriété -> onglet Application -> "Nom de l'assembly").
    Ok compris en fait ^^ Oui je renomme toute les dll qui sont des plugins pour instancier par réflexion que les dll qui contiennent des classe hérité de Plugin.

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

Discussions similaires

  1. [WPF] Image ne s'affiche qu'en preview.
    Par PokeRstarrr dans le forum Développement Web avec .NET
    Réponses: 1
    Dernier message: 04/06/2014, 10h51
  2. [WPF] <image source="" />
    Par Gregory.M dans le forum Windows Presentation Foundation
    Réponses: 14
    Dernier message: 04/03/2010, 16h01
  3. Contrôle WPF Image et application des effets
    Par guismo45 dans le forum Windows Presentation Foundation
    Réponses: 6
    Dernier message: 10/12/2008, 21h49
  4. [3.0][WPF][C#] Images vectorielles
    Par psyclik dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 16/11/2006, 10h21
  5. [Recherche] Recherche un logiciel pour assembler des images
    Par Furius dans le forum Autres Logiciels
    Réponses: 6
    Dernier message: 29/12/2005, 18h03

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