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

Silverlight Discussion :

ContentControl double dont un dynamique


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 46
    Par défaut ContentControl double dont un dynamique
    Bonjour,
    Je souhaite créer une classe dérivant de ContentControl pour implémenter un deuxième Content.
    En effet ContentControl contient un objet Content pour y mettre.. et bien du contenu et je souhaite avoir deux contenu un peu comme les expender du toolkit.

    Motivation du besoin en fin de page.

    Soit le code super allégé
    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
        public class DoubleContent : ContentControl
        {
            public DoubleContent()
            {
                this.DefaultStyleKey = typeof(DoubleContent);
     
     
            }
            public static readonly DependencyProperty HeaderContentProperty =
    DependencyProperty.Register("HeaderContent", typeof(object), typeof(DoubleContent), null);
            public object HeaderContent
            {
                get { return (object)GetValue(HeaderContentProperty); }
                set { SetValue(HeaderContentProperty, value); }
            }
        }

    En fait le HeaderContent peut être null au départ ou varier en fonction du contexte.
    Càd changer plusieurs fois après la création de l'objet.
    En mode proto cad avec un controle header existant dès le départ tout le système fonctionnait.
    En ajoutant le même header après création c'est le bronx on voit en debug dans les measure et autres ArrangeOverride que l'objet prend systématiquement une hauteur 0.

    Un bout de xaml si ça peu aider à m'aider. (ou on voit les 2 contentControl)
    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
        <Style TargetType="local:DoubleContent">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="local:DoubleContent">
                        <Canvas x:Name="RootElement" Background="Transparent" >
     
                            <ContentControl Canvas.Left="0" Canvas.Top="0" Background="Blue"
                                    x:Name="HeaderElement" 
                                    Content="{TemplateBinding HeaderContent}"/>
                            <ScrollViewer   x:Name="ScrollElement" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" Padding="0" BorderThickness="0" >
                                <ContentControl Background="Blue"
                                        x:Name="ContentElement"  Content="{TemplateBinding Content}" />
                            </ScrollViewer>
                        </Canvas>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>


    Motivation du besoin (ça peut aider à comprendre ) mon fardeau : avoir un control inconnu à la compile qui viendra par custo enduser se placer dans le Header (et les objets existant StackPanel et autres Grid ne peuvent rendre le service attendu à cause du système de placement spécifique)
    J'ai épluché, comme j'ai pu le source du toolkit de codeplex, pour trouver de l’inspiration, c'est trop chaud pour moi (et sans doc pas cool pour comprendre si les techniques peuvent s'appliquer à mon besoin)


    Merci aux courageux qui auront lu jusqu'ici

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Le problème c'est que le header.height est toujours a NAN ?
    J'ai essayé un truc dans ce genre là:

    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
     private const string HeaderElement = "HeaderElement";
            ContentControl contHeaderElement;
            private const string ScrollElement = "ScrollElement";
            ScrollViewer contScrollElement;
     
            private const string CanvasName = "RootElement";
            Canvas canCanvas;
     
            public override void OnApplyTemplate()
            {
                base.OnApplyTemplate();
                contHeaderElement = GetTemplateChild(HeaderElement) as ContentControl;
                contScrollElement = GetTemplateChild(ScrollElement) as ScrollViewer;
                canCanvas = GetTemplateChild(CanvasName) as Canvas;
                if (contHeaderElement != null)
                {
                    contHeaderElement.SizeChanged += new SizeChangedEventHandler(contHeaderElement_SizeChanged);
     
                }   
            }
     
            void contHeaderElement_SizeChanged(object sender, SizeChangedEventArgs e)
            {
                if (contScrollElement != null && canCanvas != null)
                {
                    Canvas.SetTop(contScrollElement, e.NewSize.Height);
     
                }
            }
     
            public DoubleContent()
            {
                this.DefaultStyleKey = typeof(DoubleContent);
            }
            public static readonly DependencyProperty HeaderContentProperty =
    DependencyProperty.Register("HeaderContent", typeof(object), typeof(DoubleContent), null);
     
            public object HeaderContent
            {
                get { return (object)GetValue(HeaderContentProperty); }
                set { SetValue(HeaderContentProperty, value); }
            }
     
     
        }

  3. #3
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    C'est a cause de ton Layout. Tu utilises un Panel, utilise un Grid (avec donc 2 lignes Auto et *) et tu verras ca ira tout de suite mieux.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 46
    Par défaut
    Désolé du temps mort mais j'étais en déplacement.
    Pour micka132.

    Chez moi le contHeaderElement vaut null dans le OnApplyTemplate car le content customisé ne sera connu que plus tard.
    Ce qui fait que quand je l'affecte enfin je dois lui forcer un appel à Measure(xx) pour que le controlheader fasse son propre ApplyTemplate (je m'y prend comme un manche??).

    Le problème c'est qu'entre le Measure(xx) que je fille et le availableSize que je reçois dans le Headerelement y a la hauteur qui passe à 0.
    D'ou des phénomènes type header.height à NAN.

    Le top juste pour rire j'ai pris le proto qui marche avec le header connu dès le départ mas en visible=Collapsed et bien j'ai beau le remettre visible plus tard c'est pareil il reste à hauteur 0.

    Mais merci pour ta tentative

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mars 2011
    Messages : 46
    Par défaut
    Pour réponde à Skyounet
    Les placements engendrés par le grid ne me convenaient pas. J'ai donc fouillé le Toolkit dans les expender et autre accordion pour voir si en les aidant un peu ils pourraient répondre à mes besoins.
    Et oups trop balaise pour moi, même si c'est instructif (mais ça fout un coup au moral quand on voit l'étendue de son incompétence).
    Mon problème de fond c'est aussi de faire une animation entre les deux content dont je calcul le placement relatif moi même, et je ne sais pas faire de scénario d'animation qui puisse changer de parent ou même de colonne ou de colspan etc en douceur.
    D'ou l'usage brutal du canvas

    De façon générale si vous trouvez que je monte une usine n'hésitez pas à me le dire.
    le CDC : deux content couplés mais dont un est connu plus tard, placement relatif à calculer selon x paramètres, animation entre les deux content.
    Et voila.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    En fait je comprend pas pourquoi le contHeaderElement est null.
    C'est le Content de ce contHeaderElement qui devrait être null.
    Ce test est uniquement là dans l'hypothese ou la personne a redéfinis un template du control tout entier et n'a pas mis de contHeaderElement.
    C'est le cas?

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

Discussions similaires

  1. [AJAX] Double Menu déroulant dynamique
    Par pit0n dans le forum AJAX
    Réponses: 4
    Dernier message: 05/02/2012, 00h41
  2. [MySQL] Double menu déroulant dynamique
    Par lololasticot dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/08/2010, 22h59
  3. Deux images superposées dont une dynamique
    Par RamyBoulet dans le forum SWT/JFace
    Réponses: 3
    Dernier message: 29/07/2008, 13h39
  4. Réponses: 6
    Dernier message: 04/01/2007, 01h30
  5. Réponses: 2
    Dernier message: 21/09/2005, 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