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 :

[C#] Static Resource introuvable avec un chargement dynamique de XAML


Sujet :

Windows Presentation Foundation

  1. #1
    Futur Membre du Club
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [C#] Static Resource introuvable avec un chargement dynamique de XAML
    Bonjour,

    J'ai une application WPF dans laquelle je charge un UserControl dans mon IHM dynamiquement grâce à la fonction XamlReader.Load(). Ce Usercontrol est composé de plusieurs labels bindés sur les propriétés de ma classe commande.
    Jusqu'ici tout marche bien, à l’exécution tout se charge bien mes labels sont remplis par les valeurs qu'il faut.

    Par contre dans l'un de ces labels, je dois afficher une date formatée qui s’avère être de type decimal du format yyyymmdd. Donc j'utilise dans la propriété Binding de ce label le systeme de converter qui pointe sur une StaticResource. Cette StaticResource pointe sur la fonction DecimalToDateConverter qui convertie un decimal en datetime.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <Window.Resources>
                <local: DecimalToDateConverter x:Key="decimalToDatePart" />
            </Window.Resources>
     
    <Label Name='lblCDDCDE' Content='{Binding  dc[CDDCDE],Converter={StaticResource decimalToDatePart},ConverterParameter="dd/MM/yy"}'  "></Label>

    Lorsque le UserControl se trouve dans mon fichier .xaml de mon application tout marche nickel. Mais par contre des que je le sors du fichier pour qu'il soit chargé dynamiquement, je me retrouve avec une erreur disant :
    "La valeur fournie sur 'System.Windows.StaticResourceExtension' a levé une exception."
    "Impossible de trouver la ressource nommée 'dateToDatePart'. Les noms de ressources respectent la casse".
    J'ai essayé de créer la ressource dans le UserControl mais j'ai une erreur me disant qu'il ne trouve pas la fonction DecimalToDateConverter dans le nameSpace.

    N'hésitez pas à me poser des questions si vous voulez des précisions.
    Merci.
    HarryLaHache

  2. #2
    Membre émérite Avatar de meziantou
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Points : 2 439
    Points
    2 439
    Par défaut
    Tu as essayé de remplacer les StaticResource par des DynamicResource ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Si je remplace la staticResource par une dynamicResource, j'ai une erreur à l'exécution disant :

    Impossible de définir 'DynamicResourceExtension' sur la propriété 'Converter' de type 'Binding'. Un 'DynamicResourceExtension' ne peut être défini que sur un DependencyProperty d'un DependencyObject
    donc je ne pense pas que cela soit possible : (

  4. #4
    Invité
    Invité(e)
    Par défaut
    Es-tu sûr que que c'est la ressource decimalToDatePart qui soit en cause ? Je pose cette question parce que l'erreur qui t'est remontée spécifiée que l'application n'arrive pas à toruver dateToDatePart on dirait.

  5. #5
    Futur Membre du Club
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Oui cette ressource marche car lorsque j’insère mon userControl directement dans le xaml au lieu de le charger à l’exécution tout ce passe comme il faut.

    Je pense que l'erreur vient du fait que le lien ne se fait entre la ressource crée dans la windows et l'appel de cette ressource dans le usercontrol contenu dans cette meme windows et je ne sais pas comment la rendre possible dynamiquement.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Je pense que tu ne m'as pas bien compris. Ce que je veux dire c'est : Est-ce que la ressource dateToDatePart existe dans ton UserControl apparemment elle n'y est pas ?

  7. #7
    Futur Membre du Club
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Actuellement la ressource est crée dans la windows donc je pense qu'elle n'existe pas dans le UserControl. Mais le soucis est que lorsque je la crée dans le UserControl, elle ne trouve plus ma fonction DecimaToDate qui se trouve dans une classe dans le projet et je me retrouve avec l'erreur :
    Impossible de créer le type inconnu '{clr-namespace: PrintShapeConstruction}DecimalToDateConverter'

    Si ca peut t'aider je copie le code de ma windows, UserControl et DecimalToDate.

    Code xml : 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
    <Window  x:Class="PrintShapeConstruction.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
            xmlns:local="clr-namespace:PrintShapeConstruction"       
            Title="MainWindow2" Height="768" Width="1024"
             DataContext="{Binding Source={StaticResource CommandeLocator}, Path=Commande}" Closed="Window_Closed">
            <!--<Window.Resources>
            <local:DecimalToDateConverter x:Key="DecimalToDate" />
            </Window.Resources>-->
     
        <Grid Name="Fix" Background="Beige" >
            <Button Content="Commande" Height="23" HorizontalAlignment="Left" Margin="26,16,0,0" Name="btCommande" VerticalAlignment="Top" Width="75" Click="btCommande_Click" />
            <Button Content="Echelle" HorizontalAlignment="Left" Margin="127,16,0,690" Name="btEchelle" Width="75" Click="btEchelle_Click" />
            <Button Content="Log" Height="23" Margin="0,12,12,0" Name="btLog" VerticalAlignment="Top" Click="btLog_Click" HorizontalAlignment="Right" Width="75" Focusable="False" />
     
            <Grid Name="LayoutRoot"  Margin="0,45,0,0">
     
            </Grid>
        </Grid>
    </Window>

    Code xml : 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
    <UserControl Name="ucConteneur" Background="Crimson"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    			xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
             	xmlns:local="clr-namespace:PrintShapeConstruction"       
                Height="666" Width="984" HorizontalAlignment="Left" Margin="12,12,0,0" VerticalAlignment="Top">
     
                    <UserControl.Resources>
                    <local:DecimalToDateConverter x:Key="DecimalToDate" />
                    </UserControl.Resources>
                    <Grid Name="gdConteneur">
                        <StackPanel Name="spConteneur" Height="542" Margin="28,48,765,0"  VerticalAlignment="Top">
                            <Label Name='lblCDNCDE' Content='{Binding  dc[CDNCDE]}' Background="AliceBlue"></Label>
                            <Label Name='lblCDDCDE' Content='{Binding  dc[CDDCDE],Converter={StaticResource DecimalToDate},ConverterParameter="dd/MM/yy"}'  Background="AliceBlue"></Label>
                            <Label Name='lblCDLIG' Content='{Binding  dc[CDLIG]}' ContentStringFormat='0.0°'  Background="AliceBlue" ></Label>
                            <Label Name='lblCDLIGF' Content='{Binding  dc[CDLIGF]}' Background="AliceBlue"></Label>
                            <Label Name='lblLPSPH' Content='{Binding  dc[LPSPH]}' ContentStringFormat='0.00 N;0.00 T;'  Background="AliceBlue"></Label>
                            <Label Name='lblLPEPMN' Content='{Binding  dc[LPEPMN]}' ContentStringFormat="{}{0:F1}" Background="Beige"></Label>
                        </StackPanel>                    
                    </Grid>
                </UserControl>

    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
    18
    19
    20
    public class DecimalToDateConverter : IValueConverter
        {
     
            public object Convert(object value, Type targetType, object parameter,
                                        System.Globalization.CultureInfo culture)
            {
                string dvalue = value.ToString();
                DateTime? date = new DateTime(int.Parse(dvalue.Substring(0,4)),int.Parse(dvalue.Substring(4,2)),int.Parse(dvalue.Substring(6,2)));
     
                string format = (string)parameter;
     
                return date == null ? null :  
                        date.Value.ToString(format, CultureInfo.InvariantCulture);
            }
     
            public object ConvertBack(object value, Type targetType, object parameter,
                                            System.Globalization.CultureInfo culture)
            {
                throw new NotImplementedException();
            }

    Lorsque le UserControl est chargé, il est defini comme enfant du Grid layoutRoot de ma windows.

  8. #8
    Futur Membre du Club
    Inscrit en
    Août 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Août 2011
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Problème résolu : en créant la ressource dans le fichier app.xaml mon UserControl la détecte donc tout s'affiche comme il faut.

    Merci pour l'aide que vous m'avez fourni.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/04/2012, 12h57
  2. Chargement dynamique de XAML
    Par Tod_sd dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 01/04/2009, 11h38
  3. Réponses: 4
    Dernier message: 16/06/2006, 10h49
  4. [ClassLoader] Chargement dynamique d'une classe -> problème avec packages !
    Par ymerej dans le forum API standards et tierces
    Réponses: 9
    Dernier message: 31/05/2006, 21h37
  5. Problème mémoire avec une dll par chargement dynamique
    Par widze19 dans le forum C++Builder
    Réponses: 6
    Dernier message: 15/12/2003, 13h20

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