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 :

Cast entre ImageSource et ArrayExtension.Item dans VS2010: exception (compilation et runtime OK)


Sujet :

Windows Presentation Foundation

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Par défaut Cast entre ImageSource et ArrayExtension.Item dans VS2010: exception (compilation et runtime OK)
    Bonjour!

    Je teste VS2010 sur un projet WPF VS2008.

    En design mode, ma fenetre WPF affiche une exception:
    at
    BoolToImageSourceConverter.Convert(Object value, Type targetType, Object parameter, CultureInfo culture) in \converters\BoolToImageSourceConverter.cs:line 26
    at System.Windows.Data.BindingExpression.TransferValue(Object newValue, Boolean isASubPropertyChange)
    at System.Windows.Data.BindingExpression.Activate(Object item)
    at System.Windows.Data.BindingExpression.AttachToContext(AttachAttempt attempt)
    at System.Windows.Data.BindingExpression.MS.Internal.Data.IDataBindEngineClient.AttachToContext(Boolean lastChance)
    at MS.Internal.Data.DataBindEngine.Task.Run(Boolean lastChance)
    at MS.Internal.Data.DataBindEngine.Run(Object arg)
    at MS.Internal.Data.DataBindEngine.OnLayoutUpdated(Object sender, EventArgs e)
    at System.Windows.ContextLayoutManager.fireLayoutUpdateEvent()
    at System.Windows.ContextLayoutManager.UpdateLayout()
    at System.Windows.UIElement.UpdateLayout()
    at System.Windows.Interop.HwndSource.SetLayoutSize()
    at System.Windows.Interop.HwndSource.set_RootVisualInternal(Visual value)
    at System.Windows.Interop.HwndSource.set_RootVisual(Visual value)
    at MS.Internal.Designer.VSIsolatedDesigner.ViewHolder.Initialize()
    at MS.Internal.Designer.VSIsolatedDesigner.ViewHolder..ctor(UIElement content)
    at MS.Internal.Designer.VSIsolatedDesigner.VSIsolatedView.get_ViewHandle()
    at MS.Internal.Host.Isolation.IsolatedView.get_ViewHandle()
    at MS.Internal.Designer.DesignerPane.LoadDesignerView()
    Pourtant, le code compile et aucun problème, ni exception lors de l'exécution.

    Voici le code de classe BoolToImageSourceConverter incriminée:

    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
    [ValueConversion(typeof(bool), typeof(ImageSource))]
        public class BoolToImageSourceConverter : IValueConverter
        {
            #region IValueConverter Membres
     
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
           {
                return ( (bool)value ) ?
                    ((System.Windows.Markup.ArrayExtension)parameter).Items[1]
                    :
                    ((System.Windows.Markup.ArrayExtension)parameter).Items[0];
     
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
     
                return ( (ImageSource)value == (ImageSource)(( (System.Windows.Markup.ArrayExtension)parameter ).Items[1] )) ?
                    true
                    :
                    false;
            }
     
     
            #endregion
     
     
        }
    Quelqu'un a t il une explication ?

  2. #2
    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
    Attention, VS 2010 = Version Beta = possibles bugs !

    Tu as migré le projet en .NET 4 ? C'est laquelle la ligne 26 de ton converter ?

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Par défaut
    J'ai converti la solution en projet 2010, mais je suis resté en .NET 3.5.

    Ligne 26:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     return ( (bool)value ) ?
                    ((System.Windows.Markup.ArrayExtension)parameter).Items[1]
                    :
                    ((System.Windows.Markup.ArrayExtension)parameter).Items[0];
    Je sais que c'est la version beta, c'est pour ça que je pose la question... peut-être est-ce un problème avec ArrayExtension, ou peut-être est-ce mon code qui n'est pas propre...
    Le fait que ArrayExtension soit une Markup Extension joue peut etre ?

  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
    Citation Envoyé par Chekov Voir le message
    peut-être est-ce un problème avec ArrayExtension,
    Possible: je n'ai jamais utilisé/eu besoin d'utiliser cette classe...

    Peux-tu nous montrer ton utilisation de ce converter ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Par défaut
    Bien sûr:

    J'ai un bouton défini en XAML sur lequel j'applique un binding selon que le bouton est enfoncé ou non:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <ToggleButton>
       <Viewbox>
                            <Viewbox.Resources>
                                <src2:BoolToImageSourceConverter x:Key="boolImg"/>
                            </Viewbox.Resources>
                            <Image Source="{Binding 
                                ElementName=BtnLock, 
                                Path=IsChecked, 
                                Converter={StaticResource boolImg},
                                ConverterParameter={StaticResource LockedUnlockedImageSourceArray}
                                }"/>
                        </Viewbox>
                </ToggleButton>
    BoolToImageSourceConverter retourne le premier élément ImageSource de mon ExtensionArray LockedUnlockedImageSourceArray passé en paramètre si
    BtnLock.IsChecked=false. Le deuxième élément sinon.

    LockedUnlockedImageSourceArray est défini dans un ResourceDictionary:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <x:ArrayExtension Type="ImageSource" x:Key="LockedUnlockedImageSourceArray">
            <ImageSource>/res/images/CadenasOpened.png</ImageSource>
            <ImageSource>/res/images/CadenasClosed.png</ImageSource>
        </x:ArrayExtension>
    Le code du converter est celui fourni dans mon premier post...

  6. #6
    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
    Pourquoi ne pas simplement renvoyer les images directement dans ton converter plutôt que de passer par un tableau ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Par défaut
    Afin de tout faire en XAML (j'ai juste le DataContext à définir dans le code)... mais s'il y a un autre moyen, je suis tout à fait réceptif

  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
    Ton Converter est codé en c#, Pourquoi ne pas mettre tes images dans ce code c#.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2005
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2005
    Messages : 346
    Par défaut
    Parce que j'utilise ce converter plusieurs fois... je trouve cela plus "joli". Le changement d'image est très simple dans le resourcedictionary, et ce principe me plait bien.

Discussions similaires

  1. Test entre 2 DB (Lire les "Items" dans "Containers")
    Par Ataturk dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/06/2007, 12h57
  2. [système] Comment ajouter un item dans le context menu de Windows ?
    Par ddmicrolog dans le forum API, COM et SDKs
    Réponses: 8
    Dernier message: 29/06/2005, 18h03
  3. changer le texte de tous les Items dans un mainmenu
    Par C.M dans le forum Composants VCL
    Réponses: 7
    Dernier message: 25/07/2004, 14h19
  4. Suppression d'item dans une arborescence
    Par jonzuzu dans le forum MFC
    Réponses: 2
    Dernier message: 24/02/2004, 18h45
  5. Réponses: 2
    Dernier message: 17/08/2003, 21h07

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