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 :

Utilisation d'un resx dans le XAML d'un UserControl


Sujet :

Windows Presentation Foundation

  1. #1
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut Utilisation d'un resx dans le XAML d'un UserControl
    Bonjour,

    J'ai un projet (basé sur le runtime 4.0) que je dois internationaliser.
    Le choix s'est porté sur l'utilisation de fichiers resx (il n'y a que des chaînes de caractères à mettre en ressource).

    J'ai déjà mis en ressource les fichiers de code behind et les fichiers xaml d'une application WPF mais je bloque sur la mise en ressource des UserControl.

    Ces UserControls sont dans un projet "Bibliothèque de classes" dont l'espace de nom est "MyLib".
    Le fichier resx est dans "MyLib.Ressources" et bien mis en modificateur d'accès Public.

    Dans le code-behind du UserControl, je peux accéder à une ressource via le code suivant par exemple :
    Code c# : 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
    [...]
    using MyLib.Ressources;
    
    namespace MyLib.Logs
    {  
      public partial class ucLogViewer : UserControl
      {
        [...]
        public ucLogViewer()
        {
          InitializeComponent();
          txblStatus.Text = Strings.MyTitle;
        [...]
        }
      [...]
      }
    }
    ça fonctionne.

    Du côté xaml, j'ai ceci :
    Code xaml : 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
    <UserControl x:Class="MyLib.Logs.ucLogViewer"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                 xmlns:res="clr-namespace:MyLib.Ressources"
                 mc:Ignorable="d" 
                 d:DesignHeight="250" d:DesignWidth="500">
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="*"/>
          <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="*" />
          <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
          
            <GroupBox Header="Afficher" Name="groupBox1">
                <WrapPanel
                    <CheckBox Name="chbDisplayInfo" IsChecked="True" Content="{x:Static res:Strings.MyTitle}"></CheckBox>
                    <CheckBox Name="chbDisplayAvert" IsChecked="True">Avertissements</CheckBox>
                    <CheckBox Name="chbDisplayError" IsChecked="True">Erreurs</CheckBox>
                </WrapPanel>
            </GroupBox>
    
          <TextBlock Name="txblStatus" Text="un message" Width="Auto"/>
        </Grid>
    </UserControl>
    (J'ai supprimé les éléments de positionnement et les évènements pour que ce soit plus lisible)
    En gras ce qui concerne l'utilisation du resx.
    sur "res:Strings;LogVwUIInfo", Visual Studio m'annonce dans sa liste d'erreurs
    Erreur de build inconnue, 'MC3050 : impossible de trouver le type 'Strings'. Notez que les noms de type respectent la casse.'
    La casse est bonne, preuve en est dans le code behind.

    J'ai pourtant utilisé la même méthodologie dans une application WPF et je n'ai eu aucun problème.

    Avez-vous une idée de ce qui n'irait pas ?
    Je suis preneur de toutes les pistes.

    Arnaud D.
    --
    Arnaud DANEELS

  2. #2
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Bonjour adaneels,

    Truc bête mais essaie de remplacer

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:res="clr-namespace:MyLib.Ressources"

    par

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:res="clr-namespace:MyLib.Ressources;assembly=MyLib"

    En espérant t'avoir aidé

    @+

  3. #3
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    La build action de ton fichier resx est bien PublicResXFileCodeGenerator ?

  4. #4
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    @tomlev : oui

    @koyot3 : je pensais avoir déjà essayé mais j'ai retenté.
    Effectivement, ça aide.
    La situation n'est pas résolu mais lorsque je recharge le concepteur, il affiche le visuel et m'indique un avertissement :
    MissingManifestResourceException a été levée dans "StaticExtension" : Une exception a été levée par la cible d'un appel.


    Impossible de trouver des ressources appropriées pour la culture spécifiée ou la culture neutre. Assurez-vous que "MyLib.Ressources.Strings.resources" a été correctement incorporé ou lié dans l'assembly "Ressources.Strings.Designer.cs" au moment de la compilation ou que tous les assemblys satellites requis sont chargeables et complètement signés.
    à System.Resources.ManifestBasedResourceGroveler.HandleResourceStreamMissing(String fileName)
    à System.Resources.ManifestBasedResourceGroveler.GrovelForResourceSet(CultureInfo culture, Dictionary`2 localResourceSets, Boolean tryParents, Boolean createIfNotExists, StackCrawlMark& stackMark)
    à System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo requestedCulture, Boolean createIfNotExists, Boolean tryParents, StackCrawlMark& stackMark)
    à System.Resources.ResourceManager.InternalGetResourceSet(CultureInfo culture, Boolean createIfNotExists, Boolean tryParents)
    à System.Resources.ResourceManager.GetString(String name, CultureInfo culture)
    à MyLib.Ressources.Strings.get_MyTitle()
    Je comprends bien qu'il n'arrive pas à chercher la culture correspondante (le fichier s'appelle Strings.resx et il existe bien) mais je n'ai pas eu besoin de spécifier cela lors des précédents fichiers xaml de l'autre projet de la mêm solution.

    Je suis en train de parcourir la msdn et d'autres pages à la recherche d'une piste.

    Si vous avez, je suis bien sûr tout ouïe
    --
    Arnaud DANEELS

  5. #5
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Bizarre, pourtant j'utilise tout le temps ce système pour la localisation, exactement de la même façon que toi, et je n'ai jamais eu ce problème... Je suppose que depuis le temps tu as déjà essayé de recompiler ?

  6. #6
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Re,

    Je viens de tester vite fais : ça marche chez moi sans soucis.

    C'est bien des "chaînes" que tu stockes dans ton fichier resource ?

  7. #7
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    @tomlev :
    oui, tu comprends mon désarroi du coup
    Est-ce tu as déjà fait ça sur des fichiers xaml situés dans une librairie (et non dans le projet courant) ?
    Je me demande si le fait que je sois dans une bibliothèque de classes n'est pas l'origine du problème.

    @koyot3 :
    oui oui, ce sont bien des chaînes, parfois avec des accents, sans avoir indiquer de culture particulière.

    Note sur mon avancement :
    - faire un clic droit sur "Strings.resx" dans Visual Studio et sélectionner "Exécuter un outil personnalisé" pour recréer la classe de ressources ne règle pas le problème
    - si je recréée un autre fichier de ressource, je retombe sur le premier pb.

    J'en reste là pour aujourd'hui, je vois demain pour recréer ma bibliothèque de classes... à moins qu'un génie passe par cette discussion ;-)
    --
    Arnaud DANEELS

  8. #8
    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 : 42
    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 749
    Points
    39 749
    Par défaut
    Citation Envoyé par adaneels Voir le message
    Je me demande si le fait que je sois dans une bibliothèque de classes n'est pas l'origine du problème.
    Le fichier resx est aussi dans la lib ?

    Essaie de regénérer le fichier de code qui accompagne le fichier resx (clic droit sur le fichier resx > Run custom tool)

  9. #9
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    J'ai testé avec une bibliothèque de classes, pas de soucis !
    Je vois d'où ça merdouille là

  10. #10
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Pour débuter la journée : merci pour votre aide!

    J'ai tenté de reproduire le problème sur un nouveau projet et j'ai effectivement réussi à reproduire.
    C'est le projet mis en pièce jointe (descriptif du projet qui suit si vous ne souhaitez pas télécharger).


    Voici ce que contient la solution :
    • une bibliothèque de classes contenant :
      • un label dont le content est une ressource locale à la biblio
      • un label dont le content est une ressource locale à la biblio mais assigné en code behind
    • une appli WPF contenant :
      • un label dont le content est une ressource locale au projet
      • le contrôle utilisateur de la bilbiothèque


    Je n'arrive pas à compiler la solution : une erreur survient sur une des liaisons aux ressources. Si je corrige l'erreur annoncée sur le contrôle utilisateur, une erreur survient sur MainWindow.xaml (la fenêtre principale du projet WPF).

    Pouvez-vous me dire si j'ai zappé quoi que ce soit ou si vous rencontrez le même problème svp ?

    Arnaud D.
    Fichiers attachés Fichiers attachés
    --
    Arnaud DANEELS

  11. #11
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Bonjour à toi,

    Voici mon code pour ton MainWindow.xaml :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <Window x:Class="testlocal.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:rl="clr-namespace:ClassLibrary1.Properties;assembly=ClassLibrary1"
            xmlns:r="clr-namespace:testlocal.Properties"
            Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:ClassLibrary1;assembly=ClassLibrary1">
        <Grid>
            <Label Content="{x:Static rl:Resources.resclasslib}" Height="46" HorizontalAlignment="Left" Margin="67,81,0,0" Name="label2" VerticalAlignment="Top" Width="292"/>
            <Label Content="{x:Static r:Resources.String1}" Height="46" HorizontalAlignment="Left" Margin="67,31,0,0" Name="label1" VerticalAlignment="Top" Width="292"/>
            <my:UserControl1 HorizontalAlignment="Left" Margin="159,154,0,0" Name="userControl11" VerticalAlignment="Top" />
        </Grid>
    </Window>

    Le premier label récupère la valeur de le fichier Resources.resx de ta librairie et le second celle dans les resources locales de ton projet.

    En espérant que ça te débloque

    Bonne journée

  12. #12
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    @koyot3 : merci!

    Indépendament de cette réponse, j'ai remarqué une chose : en supprimant le ";assembly=testlocal" de la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xmlns:rl="clr-namespace:testlocal.Properties;assembly=testlocal
    dans le MainWindow.xaml, j'ai le message MissingManifestResourceException.

    Mais le projet s'exécute tout de même en faisant F5.
    une fois l'exécution arrêtée, le message n'est plus là.

    Bizarre mais c'est résolu !

    Merci encore à tous les deux (et la journée sera sûrement meilleure que celle d'hier du coup )
    --
    Arnaud DANEELS

  13. #13
    Membre actif
    Avatar de adaneels
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Août 2006
    Messages
    236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Août 2006
    Messages : 236
    Points : 210
    Points
    210
    Par défaut
    Juste pour annoncer que la solution annoncée plus haut fonctionne aussi dans le projet où j'avais le problème initialement.

    Have a nice day !
    --
    Arnaud DANEELS

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/12/2010, 20h43
  2. Réponses: 1
    Dernier message: 29/06/2010, 11h44
  3. utiliser le même fichier dans plusieurs projets vc++6
    Par yannick_sch dans le forum MFC
    Réponses: 5
    Dernier message: 12/02/2004, 17h39
  4. Utilisation de l'unicode dans un algo de cryptage
    Par Zazeglu dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 28/10/2003, 14h38
  5. Réponses: 2
    Dernier message: 24/06/2003, 20h31

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