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 :

Comment accéder aux propriétés d’un contrôle personnalisé par un style?


Sujet :

Windows Presentation Foundation

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Comment accéder aux propriétés d’un contrôle personnalisé par un style?
    Bonjour,

    Dans le cadre d’un projet, j’ai voulu encapsuler un éditeur «TextBox» et personnaliser ses propriétés par l’intermédiaire des styles (parent et enfant).

    J’ai créé le projet «WrapperEditor» mise en pièce jointe qui démontre ma problématique. Il est constitué principalement de :
    • WrapperEditor.MainWindow - représente l’utilisation des éditeurs avec leurs styles
    • WrapperEditor.Editors.TextEdit - user control personnalisé qui encapsule l’éditeur TextBox
    • Themes.Generic.Editors.TextEdit - resourceDictionary qui définit tout les styles du type WrapperEditor.Editors.TextEdit


    J’en viens à ma problématique, comment déclarer ma propriété Editor dans la class WrapperEditor.Editors.TextEdit pour qu’elle soit accessible par le setter de mon style?

    Code
    ----------------------------------------------------------------------------------------------------------------------------------------------------

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /// <summary>
    ///  Identifies the Editor dependency property.
    /// </summary>
    public static readonly DependencyProperty EditorProperty = DependencyProperty.Register("Editor", typeof(TextBox),typeof(TextEdit), new UIPropertyMetadata(null));
     
    /// <summary>
    /// Gets or sets the wrapper editor.
    /// </summary>
    public TextBox Editor
    {
    get { return (TextBox)GetValue(EditorProperty); }
    set { SetValue(EditorProperty, value); }
    }

    Style
    ----------------------------------------------------------------------------------------------------------------------------------------------------

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <!-- Memo_TextEditStyle -->
    <Style x:Key="Memo_TextEditStyle" TargetType="{x:Type edt:TextEdit}" BasedOn="{StaticResource Default_TextEditStyle}" >
     <!--Comment accéder à la propriété Editor de edt:TextEdit ? -->
     <!--<Setter Property="Editor.MaxLength" Value="4000" />-->
     <!--<Setter Property="Editor.AcceptsReturn" Value="true" />-->
    </Style>

    Je recherche à faire la même chose que cet exemple, c'est-à-dire atteindre la propriété TextBlock de la class TextBox.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <!-- Default_TextBoxStyle -->
    <Style x:Key="Default_TextBoxStyle" TargetType="{x:Type TextBox}" >
    <Setter Property="TextBlock.FontFamily" Value="Verdana" />
    </Style>

    En attendant votre réponse, je vous remercie d’avance pour votre aide.

    Salutations,
    PAJ
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Il n'y a pas de propriétés TextBlock sur la classe TextBox: TextBlock est un type...

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    faudrait pas que tu mette une dependency property mais une propriete normale
    en lecture seule
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public TextBox Editor
    {
    get { return this.matextbox1; }
    }
    n'oublie pas de mettre pour la textebox le x:name="textbox1"

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par ikeas Voir le message
    faudrait pas que tu mette une dependency property mais une propriete normale
    en lecture seule
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public TextBox Editor
    {
    get { return this.matextbox1; }
    }
    n'oublie pas de mettre pour la textebox le x:name="textbox1"
    Merci pour la rapidité de vos réponses, j’ai essayé de mettre la propriété Editor à readonly sans DependencyProperty.

    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    /// <summary>
    /// Gets the wrapper editor.
    /// </summary>
    public TextBox Editor
    {
        get 
        {
           return  this.internalEditor; 
        }
    }

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <Grid>
      <TextBox x:Name="internalEditor" />
    </Grid>

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    <!-- Standard_TextEditStyle -->
      <Style x:Key="Standard_TextEditStyle" TargetType="{x:Type edt:TextEdit}" BasedOn="{StaticResource Default_TextEditStyle}" >
        <!--Comment accéder à la propriété Editor de edt:TextEdit ? -->
        <Setter Property="Editor.MaxLength" Value="255" />
      </Style>

    Mais voici le message d’erreur :
    Cannot resolve the Style Property 'MaxLength'. Verify that the owning type is the Style's TargetType, or use Class.Property syntax to specify the Property

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    écoute la j'ai regarde ton code
    en général on ne fait pas comme ca
    - on crée plutôt un customcontrol avec un style de base (classe dérrivée de control avec un style defini)
    - on rajoute en dependency property toutes les propriété que l'on veut voir exposées que l'on bind dans la style de base sur un templatebinding

    la vu que tu mélange un peut ca devient delicat

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci d’avoir consacré du temps à ma problématique.

    Dans mon cas j’ai besoin d’hériter d’une classe de base et d’encapsuler un éditeur pour avoir toutes ces fonctionnalisées.

    Il me semble bizarre de ne pas pouvoir atteindre une propriété de ma classe par un style.

    Si j’utilise un CustomControl, je devrais normalement étendre la classe TextBox dans mon cas et je ne pourrais plus hériter de ma classe de base.

    Est-ce qu’on ne peut vraiment pas exposer cette propriété pour qu’elle soit accessible à un style ?

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 562
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 562
    Points : 1 313
    Points
    1 313
    Par défaut
    non tu peux ajouter la textbox a ton style et publier dans ton composant les proprietes auquel tu souhaite communiquer

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Il n'y a pas de propriétés TextBlock sur la classe TextBox: TextBlock est un type...
    Je n’ai pas compris votre réponse dans le sens que c’est vrai qu’il n’y a pas de propriété TextBlock dans TextBox comme j’ai pu le constater avec XAMLPad.

    Mais quel est son interaction avec le TextBox ? Si je me réfère à votre livre « WPF par la pratique » au chapitre « Personnalisation du style » vous décrivez cet exemple:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      <!-- TextBoxPrenomStyle -->
      <Style x:Key="TextBoxPrenomStyle" TargetType="{x:Type TextBox}" >
        <Setter Property="TextBlock.Foreground" Value="Red" />
        <Setter Property="TextBlock.FontSize" Value="20" />
      </Style>

  9. #9
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Peux-tu réexpliquer ce que tu veux faire clairement ? Car là, on s'y perd un peu...

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2008
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Thomas Lebrun Voir le message
    Peux-tu réexpliquer ce que tu veux faire clairement ? Car là, on s'y perd un peu...
    J’aimerais premièrement comprendre un élément de base par l’exemple du style ci-dessous qui démontre la personnalisation du Foreground et FontSize du TextBlock à un type cible TextBox.

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      <!-- TextBoxPrenomStyle -->
      <Style x:Key="TextBoxPrenomStyle" TargetType="{x:Type TextBox}" >
        <Setter Property="TextBlock.Foreground" Value="Red" />
        <Setter Property="TextBlock.FontSize" Value="20" />
      </Style>
    Quel est le lien entre le TextBlock et le TextBox? Je ne le vois pas avec XAMLPad.

Discussions similaires

  1. [Débutant] C# Comment accéder aux propriétés des contrôle sur un autre formulaire
    Par Claude_Azoulai dans le forum Visual Studio
    Réponses: 0
    Dernier message: 03/04/2013, 17h04
  2. Réponses: 2
    Dernier message: 13/02/2008, 10h58
  3. Accéder aux propriétés d'une interface par son nom
    Par slimjoe dans le forum Langage
    Réponses: 1
    Dernier message: 06/07/2007, 14h31
  4. Réponses: 3
    Dernier message: 02/01/2007, 14h09
  5. Réponses: 6
    Dernier message: 25/09/2006, 17h08

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