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 :

Creation composant silverlight


Sujet :

Silverlight

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Par défaut Creation composant silverlight
    Salut à tous,

    Je suis débutant en silverlight et je cherche à créer les composants dont j'ai besoin, je suis en silverlight 3 vs 2010.

    J'ai donc placé dans la fichier generix.xaml la définition du composant que je veux créer en gros c'est juste une sorte de boite avec un en-tête dans lequel je veux pouvoir placer d'autre composants (Textblock, chabox, TextBox...) en mode design:

    Voici le code 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
     
                        <Grid x:Name="LayoutRoot" Background="White">
                            <Border Margin="0,20,0,0" BorderThickness="1,1,1,1" BorderBrush="Silver">
                                <Grid Name="ContentGrid">
                                </Grid>
                            </Border>
                            <Border CornerRadius="8,8,0,0" BorderBrush="Silver" BorderThickness="1" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Top" >
                                <TextBlock x:Name="TXT_Header" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"></TextBlock>
                                <Border.Background>
                                    <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                        <GradientStop Color="White" Offset="0"/>
                                        <GradientStop Color="#FF8991FF" Offset="0.25"/>
                                        <GradientStop Color="Blue" Offset="0.4"/>
                                        <GradientStop Color="Navy" Offset="1"/>
                                    </LinearGradientBrush>
                                </Border.Background>
                            </Border>
                        </Grid>
    J'ai bien évidement une classe associée, mais là n'est pas la question.
    Aprés compilation je cherche à utiliser mon composant et je ne peux pas le remplir avec des éléments, j'ai un message intellisense de vs :
    TestHeaderedPresenter does not support direct content
    Bref quelqu'un sait-il comment je dois faire pour bien faire pour permettre de remplir ce composant ?

    Merci à tous,

  2. #2
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Il doit y'avoir un truc à faire:
    Créer une dependency property Content dans ton code behind qui peut contenir un contrôle.
    Ajouter un composant ContentPresenter dont le contenu est bindé a ta dependency property.

    Apres tu devrais pouvoir te service de ton composant comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <TestHeaderedPresenter>
        <TestHeaderedPresenter.Content>
          <TextBlock Text="Coucou" />
        </TestHeaderedPresenter.Content>
    </TestHeaderedPresenter>

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    121
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 121
    Par défaut
    Ou il suffit que ton custom control hérite de ContentControl avec un ContentContainer du genre une grid et tu pourras le remplir avec ce que tu veux

  4. #4
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Mais sais-tu que tu as dans le silverlight toolkit tu as un contrôle tout prêt pour cette usage?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Par défaut Creation compo
    Déjà merci à ceux qui ont répondu.

    En fait vu que je developpe avec vs 2010 RC, je ne peux pas installer le toolkit, par la suite j'ai un bug qui ne me permet plus d'avoir la partie design super pratique de vs 2010... Mais bref, je prend aussi cette partie comme un exercice et aussi pour avoir le plein controle de mon design.

    En fait tel que vous l'expliquez ca parait hyper logique, j'essaie de le mettre en place mais ca ne marche toujours pas.... Y'a surement un truc que je ne fait pas correctement (trop noobs pour percuter).

    voici mon generic.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
     
                        <Grid x:Name="LayoutRoot" Background="White">
                            <Border Margin="0,20,0,0" BorderThickness="1,1,1,1" BorderBrush="Silver">
                               <Grid Name="MainContent">                                    
                               </Grid>
                            </Border>
                            <Border CornerRadius="8,8,0,0" BorderBrush="Silver" BorderThickness="1" Height="25" HorizontalAlignment="Stretch" VerticalAlignment="Top" >
                                <TextBlock x:Name="TXT_Header" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"></TextBlock>
                                <Border.Background>
                                    <LinearGradientBrush EndPoint=".7,1" StartPoint=".7,0">
                                        <GradientStop Color="White" Offset="0"/>
                                        <GradientStop Color="#FF8991FF" Offset="0.25"/>
                                        <GradientStop Color="Blue" Offset="0.4"/>
                                        <GradientStop Color="Navy" Offset="1"/>
                                    </LinearGradientBrush>
                                </Border.Background>
                            </Border>
                        </Grid>
    Voici mon code behind
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
        [TemplatePart(Name = "HeaderText", Type = typeof(TextBlock))]
        [TemplatePart(Name = "MainContent", Type = typeof(Grid))]
        public partial class TestHeaderedPresenter : Control
        {
            public TestHeaderedPresenter() : base()
            {                      
                this.DefaultStyleKey = typeof(TestHeaderedPresenter); 
            }
     
            public string HeaderText
            {
                get { return GetValue(HeaderTextProperty).ToString(); }
                set { SetValue(HeaderTextProperty, value);   }
            }
     
            public static DependencyProperty HeaderTextProperty = DependencyProperty.Register(
                "HeaderText",
                typeof(string),
                typeof(TestHeaderedPresenter),
                new PropertyMetadata(
                    new PropertyChangedCallback(OnHeaderTextPropertyChanged)
                )
            );
     
            public Grid MainContent
            {
                get { return (Grid)GetValue(MainContentProperty); }
                set { SetValue(MainContentProperty, value);       }
            }
     
            public static DependencyProperty MainContentProperty = DependencyProperty.Register(
                "MainContent",
                typeof(Grid),
                typeof(TestHeaderedPresenter),
                new PropertyMetadata(
                    new PropertyChangedCallback(OnMainContentPropertyChanged)
                )
            );
     
            private TextBlock txt_Header;
            private TextBlock TXT_Header
            {
                get { return txt_Header; }
                set
                {
                    txt_Header = value;
                    if (txt_Header != null)
                    {
                        txt_Header.Text = HeaderText;
                        txt_Header.IsHitTestVisible = true;
                    }
                }
            }
     
     
            public override void OnApplyTemplate()
            {
                this.TXT_Header = GetTemplateChild("TXT_Header") as TextBlock;
                this.MainContent = GetTemplateChild("MainContent") as Grid;
                Debug.Assert(this.MainContent != null, "Grid MainContent is null");
                Debug.Assert(this.TXT_Header != null, "Textblock TXT_Header is null");
     
                base.OnApplyTemplate();
            }
     
            public static void OnMainContentPropertyChanged(DependencyObject dpObj,
                DependencyPropertyChangedEventArgs e)
            {
                TestHeaderedPresenter ctrl = (dpObj as TestHeaderedPresenter);
                if ((ctrl != null) && (ctrl.TXT_Header != null))
                {
                    ctrl.MainContent = (e.NewValue as Grid);
                }
            }
     
            public static void OnHeaderTextPropertyChanged(DependencyObject dpObj,
                DependencyPropertyChangedEventArgs e)
            {
                TestHeaderedPresenter ctrl = (dpObj as TestHeaderedPresenter);
                if ((ctrl != null)&&(ctrl.TXT_Header != null))
                {
                    ctrl.TXT_Header.Text = e.NewValue.ToString();
                }
            }
        }
    Puis enfin je peux donc assigner un grid dans mon page.xaml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
                    <custom:TestHeaderedPresenter HeaderText="VOUS ETES UN CLIENT" Margin="6,235,283,113">
                        <custom:TestHeaderedPresenter.MainContent>
                            <Grid>
                                <CheckBox Content="toto"></CheckBox>
                            </Grid>
                        </custom:TestHeaderedPresenter.MainContent>
                    </custom:TestHeaderedPresenter>
    et là... Rien... Pas de checkbox qui ne daigne apparaitre.
    Voilà, si un pro du silverlight repond c'est sympa.

  6. #6
    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
    Il faut que ton contrôle hérite de ContentControl à la place de Control. Tu peux donc enlever ton dependency MainContent.

    Ensuite pour ton TextBlock dans ton theme mets ça à la place

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock x:Name="TXT_Header" Text="{TemplateBinding HeaderText}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"></TextBlock>
    Pour finir pour afficher le contenu de ton contrôle il te faut un ContentPresenter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ContentPresenter Content="{TemplateBinding Content}" Margin="{TemplateBinding Padding}" />
    Et là tout devrait être bon (en tu peux enlever pas mal de code également).

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Par défaut Creation composant
    Merci pour la réponse...

    J'ai toujours un problème avec le TemplateBinding... Quel qu'en soit la forme dés que j'intègre une notion style Text="{TemplateBinding HeaderText}" ou Header text réprésente bien la dependency property que j'ai crée dans ma classe ca plante déjà en mode design avec le message "Unknown attribute Text on element TextBlock"... j'ai pourtant vérifié au bas mot 150 000 fois ma syntaxe en tenant compte des majuscules \ Minuscules rien n'y fait.

    A savoir que j'ai la version vs 2010 RC... Sagit-il d'un bug ?

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Par défaut
    Sinon pour la partie avec le ContentPresenter ca marche nickel.
    Je met juste une gris dans le content et j'ai bel et bien ce que je veux.

    Par contre la partie ou je TemplateBinding une dependency que je crée dan ma classe me renvoie toujours bel et bien l'"erreur du précédent post.

  9. #9
    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 marrant parce que j'ai fait la même chose hier. Une sorte de GroupBox (je sais pas si c'est ce que toi tu as fait mais bon).

    Et j'ai bien ça

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <TextBlock Margin="3,0,3,0" Text="{TemplateBinding Header}" />

    Avec

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public string Header
    {
        get { return (string)GetValue(HeaderProperty); }
        set { SetValue(HeaderProperty, value); }
    }
     
    // Using a DependencyProperty as the backing store for Header.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty HeaderProperty =
        DependencyProperty.Register("Header", typeof(string), typeof(GroupBox), null);

    Essaye de faire un clean de ta solution pis un rebuild et ensuite essaye de lancer même si ça s'affiche pas dans le designer.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 52
    Par défaut Compo
    Ok, apparemment je n'ai pas le probleme sur la version de programme installée chez moi... C'est donc un bug de ma release candidate. Je vais faire des essais.... mais la méthodologie est bien celle que tu as donné.

    Merci pour ces bons conseils.

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

Discussions similaires

  1. [Joomla!] Creation Composants et Modules Joomla
    Par rfily dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 01/04/2009, 14h42
  2. [Joomla!] creation composant Joomla
    Par badis12 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 10/02/2009, 15h38
  3. Upload de fichiers au travers d'un composant Silverlight
    Par Ditch dans le forum Silverlight
    Réponses: 6
    Dernier message: 06/05/2008, 20h18
  4. [TWinControl] creation composant
    Par esa dans le forum Composants VCL
    Réponses: 25
    Dernier message: 16/12/2005, 15h37
  5. [Creation composant visuel] Problème avec le focus
    Par Ingham dans le forum Composants VCL
    Réponses: 9
    Dernier message: 23/09/2004, 16h59

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