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 :

[Binding] UserControl non mis à jour


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2004
    Messages : 157
    Par défaut [Binding] UserControl non mis à jour
    Bonjour à tous,

    Je commence en WPF et je tente de faire un usercontrole.

    Le principe de ce usercontol est que j'ai deux images, l'image par défaut et son ombre.

    Je définis donc dans une propriété ImagePath l'image qui sera affiché et ImageWidth la largeur de l'image.

    Le hic est que mon binding n'est pas mis a jour.

    J'ai tenté d'utilisé DependencyProperty.

    Puis j'ai tenté tout simplement d'implémenter l'interface INotifyPropertyChanged mais rien n'y fait.

    Voici mon XAML
    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
     
    <UserControl x:Class="WpfAnimation.Tools.AnimatedImage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:WpfAnimation"
                 xmlns:tools="clr-namespace:WpfAnimation.Tools">
        <UserControl.Resources>
            <Style TargetType="{x:Type Image}" x:Key="RefletStyle">
                <Setter Property="OpacityMask">
                    <Setter.Value>
                        <LinearGradientBrush EndPoint="0.5,0" StartPoint="0.5,1">
                            <GradientStop Color="#7F000000" Offset="0"/>
                            <GradientStop Color="#00FFFFFF" Offset="1"/>
                        </LinearGradientBrush>
                    </Setter.Value>
                </Setter>
                <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/>
                <Setter Property="RenderTransform">
                    <Setter.Value>
                        <TransformGroup>
                            <ScaleTransform ScaleX="1" ScaleY="-0.75"/>
                        </TransformGroup>
                    </Setter.Value>
                </Setter>
            </Style>
            <tools:ImageConverter x:Key="imageConverter" />
        </UserControl.Resources>
        <StackPanel>
            <Image Name="imgDefault" Width="{Binding ElementName=AnimatedImage, Path=ImageWidth}"
                   Source="{Binding ElementName=AnimatedImage,Converter={StaticResource imageConverter}, Path=ImagePath}"/>
            <Image Name="imgShadow" Width="{Binding ElementName=AnimatedImage, Path=ImageWidth}" Source="{Binding ElementName=AnimatedImage,Converter={StaticResource imageConverter}, Path=ImagePath}"
                   Style="{StaticResource RefletStyle}"/>
        </StackPanel>
    </UserControl>
    et mon code beind
    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
     
    public partial class AnimatedImage : UserControl, INotifyPropertyChanged
        {
            public string _ImagePath;
            public string ImagePath
            {
                get
                { 
                    return _ImagePath;
                }
                set
                {
                    _ImagePath = value;
                    NotifyPropertyChanged("ImagePath");
                }
            }
     
            private int _ImageWidth = 50;
            public int ImageWidth
            {
                get
                {
                    return _ImageWidth;
                }
                set
                {
                    _ImageWidth = value;
                    NotifyPropertyChanged("ImageWidth");
                }
            }
     
            public AnimatedImage()
            {
                InitializeComponent();
            }
     
            #region INotifyPropertyChanged Membres
     
            public event PropertyChangedEventHandler PropertyChanged;
     
            private void NotifyPropertyChanged(String info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
     
            #endregion
        }
    Mon converter
    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
     
    public sealed class ImageConverter : IValueConverter
        {
            #region IValueConverter Membres
     
            public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                try
                {
                    return new BitmapImage(new Uri((string)value, UriKind.Absolute));
                }
                catch
                {
                    return new BitmapImage();
                }
            }
     
            public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
            {
                try
                {
     
                    return (value as BitmapImage).BaseUri.LocalPath;
                }
                catch
                {
                    return "";
                }
            }
     
            #endregion
        }
    Le but est donc que quand j'ai placé mon composant sur une window et que je lui renseigne le ImagePath et le ImageWidth, le composant soit directement prêt.

    Si vous avez une idée d'où vient le problème n'hésitez pas.

    Merci d'avance

  2. #2
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Bonjour,


    Lorsque tu effectues tes liaisons, tu te bindes toujours sur le contrôle de nom "AnimatedImage" mais je ne le vois pas dans ton arborescence... Le problème vient peut être de là...

    Sinon, c'est un détail, les tailles d'images, etc sont de type Double et pas integer..

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2004
    Messages : 157
    Par défaut
    Ok merci, j'ai toujours utilisé des int pour les height width j'ai donc pas été chercher plus loin.

    Pour ce qui est du nom AnimatedImage, c'est le nom de ma classe.

    J'ai même tenté de rajouter des les ressources comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <tools:AnimatedImage x:Key="ucAnimated"/>
    et j'ai remplacé dans mon binding AnimatedImage par ucAnimated

    mais il semblerait que ça ne change rien.

  4. #4
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Citation Envoyé par matrix_ceg Voir le message
    Pour ce qui est du nom AnimatedImage, c'est le nom de ma classe.

    Lorsque tu fais un binding, il se fait par défaut sur le DataContext courant. Si tu indiques un ElementName, par exemple YYY, il utilisera le contrôle ayant pour nom YYY comme source de données. Est-ce que ce contrôle existe dans ton arborescence ?

    Je pense que ce que tu souhaites faire, c'est placer l'instance de ta classe AnimatedImage(que tu utilises pour fiwer la taille,etc.) dans le DataContext de ton UserControl. Si tu enlèves la partie ElementName=AnimatedImage, alors les valeur utilisées seront celles de l'objet dans DataContext.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2004
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Décembre 2004
    Messages : 157
    Par défaut
    Donc dans mon arborescence projet, j'ai

    MonProjet
    --Tools (répertoire)
    ----AnimatedImage.xaml(+ .cs)
    Window

    dans ma window, j'utilise le composant comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <StackPanel Orientation="Horizontal" Height="100" Width="Auto">
                <tool:AnimatedImage x:Name="ais1" ImageWidth="50" ImagePath="E:\Images\test.jpg"/>
                <tool:AnimatedImage x:Name="ais2" ImageWidth="50" ImagePath="E:\Images\3469030005251_F.jpg"/>
                <tool:AnimatedImage x:Name="ais3" ImageWidth="50" ImagePath="E:\Images\3397700053427_Q.jpg"/>
            </StackPanel>

    J'ai donc mis comme je dis plus haut en ressource AnimatedImage et je l'ai utilisé dans le context. depuis dès que j'ouvre mon controle, vs plante.

    Je pense que c'est stack overflow

    ps : comme tu me l'as dis, j'ai retiré element du binding et ai ajouté le datacontext sur les images.

    DataContext="{StaticResource ucAnimated}"

    il semble pas aimer du tout.

  6. #6
    Membre émérite Avatar de jmix90
    Homme Profil pro
    Consultant .Net
    Inscrit en
    Juillet 2007
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 576
    Par défaut
    Oki, dans ce cas, dans le code plus haut il fallait plutôt mettre ElementName=ais1 non ?

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

Discussions similaires

  1. Settings non mis à jour lors du debuggage
    Par Fouinard dans le forum Visual Studio
    Réponses: 0
    Dernier message: 27/09/2008, 05h58
  2. [DW CS3] Liens non mis à jour dans un modèle
    Par Aspic dans le forum Dreamweaver
    Réponses: 0
    Dernier message: 18/07/2008, 06h52
  3. [TortoiseSVN] Statut fichier non mis à jour
    Par jeffvac dans le forum Subversion
    Réponses: 6
    Dernier message: 16/04/2008, 11h43
  4. [AJAX] Incompatibilité avec IE (données non mis à jour)
    Par WeDgEMasTeR dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 23/05/2007, 19h46
  5. parametre non mis à jour
    Par rherrad dans le forum Struts 1
    Réponses: 2
    Dernier message: 11/04/2007, 13h35

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