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 :

Appliquer un FontFamily sur une colonne


Sujet :

Silverlight

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 116
    Par défaut Appliquer un FontFamily sur une colonne
    Bonjour,

    je cherche actuellement à appliquer un Fontfamily (défini dans un converter) à une datagridColumn.

    J'ai donc le converter suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                FontFamily returnValue = new FontFamily("Time New Roman");
                if (value == null || value.ToString() == "normal")
                {
                    returnValue = new FontFamily("Time New Roman");
                }
                else if (value == null || value.ToString() == "gras")
                {
                    returnValue = new FontFamily("Time New Roman Bold");
                }
                else if (value == null || value.ToString() == "gris")
                {
                    returnValue = new FontFamily("Time New Roman Gray");
                }
                return returnValue;
    Et j'essaye de l'appliquer comme suit, sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <sdk:DataGridTextColumn Header="Libellé"
                                      Width="60"
                                       Binding="{Binding Lib, Mode=TwoWay}"  
                                                                    ToolTipService.ToolTip="{Binding LibQualite}">
              <sdk:DataGridTextColumn.ElementStyle>
                     <Style TargetType="TextBlock">
                              <Setter Property="FontFamily" Value="{Binding rowStyle, Converter={StaticResource RowStyleConverter}}" />
                     </Style>
              </sdk:DataGridTextColumn.ElementStyle>
     </sdk:DataGridTextColumn>
    J'ai aussi essaye d'appliquer cela à ma datagrid, pour que cela change le style toute la ligne, mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <sdk:DataGrid Grid.Row="0"
                        Grid.Column="0"
                        Name="dgListe" 	
                        VerticalAlignment="Top"
                        HorizontalAlignment="Left"
                        AutoGenerateColumns="False" 	
                       AlternatingRowBackground="Orange"
                      FontFamily="{Binding rowStyle, Converter={StaticResource RowStyleConverter}}"
                      IsReadOnly="True">
    Comment pourrais je faire, pour changer la police de texte de chaque ligne, en fonction de la valeur obtenue grace à mon converter? Que je doive le faire en xaml, ou bien dans le code Behind(en bouclant sur les éléments de la datagrid).

    Merci.

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut
    Si ça peut t'aider, voilà comment je ferais une liste de polices "à la Word" (je n'ai pas compris si c'était exactement ça que tu voulais obtenir) :

    Au lieu des noms de police, je mets les polices elle-mêmes comme source du DataGrid :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Fonts As New List(Of FontFamily)
    For Each FontName In {"Arial", "Comic Sans MS", "MS Sans Serif", "Times New Roman"}
    	Fonts.Add(New FontFamily(FontName))
    Next
    Me.gridFonts.ItemsSource = Fonts
    Et dans le XAML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <sdk:DataGrid x:Name="gridFonts" AutoGenerateColumns="False">
    	<sdk:DataGrid.Resources>
    		<DataTemplate x:Key="FontTpl">
    			<TextBlock Text="{Binding Source}" FontFamily="{Binding}" FontSize="12"/>
    		</DataTemplate>
    	</sdk:DataGrid.Resources>
    	<sdk:DataGrid.Columns>
    		<sdk:DataGridTemplateColumn Header="Police" CellTemplate="{StaticResource FontTpl}" Width="*"/>
    	</sdk:DataGrid.Columns>
    </sdk:DataGrid>
    De cette manière, il est inutile de passer par un Converter.

    (attention, c'est "Times New Roman" avec un S, pas "Time New Roman" )

  3. #3
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 116
    Par défaut
    Si ça peut t'aider, voilà comment je ferais une liste de polices "à la Word" (je n'ai pas compris si c'était exactement ça que tu voulais obtenir) :
    Je voudrais afficher le texte de chaque ligne de manière différente, en fonction des objets de la grid.

    Si tu as propriété 1 == null, tu met en gras, si tu as propriété 1 := null et prop 2 == null, tu met en italic, et sinon tu met en grisé.

    De cette manière, il est inutile de passer par un Converter.
    Du coup, avec mon besoin, il me semble que je suis obligé de passé par un converter.

    (attention, c'est "Times New Roman" avec un S, pas "Time New Roman" )
    Oups, merci

    Si je met ceci, dans <datagrid> rien ne se passe (il ne vas pas dans le converter), mais pas d'erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                                    <sdk:DataGrid Grid.Row="0"
                                                  Grid.Column="0"
                                                  Name="dgListe" 	
                                                  VerticalAlignment="Top"
                                                  HorizontalAlignment="Left"
                                                  AutoGenerateColumns="False" 	
                                                  AlternatingRowBackground="Orange"
                                                  FontFamily="{Binding RowStyle, Converter={StaticResource RowStyleConverter}, Mode=TwoWay}"
     
                                                  IsReadOnly="True">

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut
    D'accord, dans ce cas il ne faut pas utiliser FontFamily, cette propriété n'a pas de rapport avec le style des caractères (gras ou italique).

    Pour le gras, c'est la propriété FontWeight (valeur : FontWeights.Bold ou FontWeights.Normal), pour les italiques c'est FontStyle (valeur : FontStyles.Italic ou FontStyles.Normal).

    Pour obtenir ce que tu veux, tu peux ajouter 3 propriétés, de type FontWeight, FontStyle et SolidColorbrush pour la couleur aux objets de ta collection liée au datagrid.

    Ensuite dans le XAML tu lies par exemple FontWeight à la propriété "Weight" (pour le gras) que tu as définie dans ton objet, de cette manière : FontWeight="{Binding Path=Weight}".

    Voilà un exemple où la source du datagrid est une collection d'objets "MonObjet" avec trois champs, Libelle, Prop1 et Prop2 :

    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
     
    Partial Public Class MainPage
        Inherits UserControl
     
        Public Sub New()
     
            InitializeComponent()
     
            Dim Liste As New List(Of MonObjet)
            Liste.Add(New MonObjet("Un"))
            Liste.Add(New MonObjet("Deux", , 1))
            Liste.Add(New MonObjet("Trois", 1, 1))
            Me.myGrid.ItemsSource = Liste
     
        End Sub
     
    End Class
     
    Public Class MonObjet
     
        Public Property Libelle As String
        Public Property Prop1 As Object
        Public Property Prop2 As Object
     
        Sub New(lbl As String, Optional pr1 As Object = Nothing, Optional pr2 As Object = Nothing)
     
            Me.Libelle = lbl
            Me.Prop1 = pr1
            Me.Prop2 = pr2
     
        End Sub
     
        Public ReadOnly Property Weight() As FontWeight
            ' renvoie FontWeights.Bold (gras) si Prop1 = null et Prop2 <> null
            Get
                Return If(Me.Prop1 = Nothing, If(Me.Prop2 = Nothing, FontWeights.Normal, FontWeights.Bold), FontWeights.Normal)
            End Get
        End Property
     
        Public ReadOnly Property Style() As FontStyle
            ' renvoie FontStyle.Italic si Prop1 = null et Prop2 = null
            Get
                Return If(Me.Prop1 = Nothing AndAlso Me.Prop2 = Nothing, FontStyles.Italic, FontStyles.Normal)
            End Get
        End Property
     
        Public ReadOnly Property Couleur() As SolidColorBrush
            ' renvoie Gray si Prop1 n'est pas null, sinon noir
            Get
                Return New SolidColorBrush(If(Me.Prop1 <> Nothing, Colors.Gray, Colors.Black))
            End Get
        End Property
     
    End Class
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <sdk:DataGrid x:Name="myGrid" AutoGenerateColumns="False">
    	<sdk:DataGrid.Resources>
    		<DataTemplate x:Key="FontTpl">
    			<TextBlock Text="{Binding Libelle}"  FontWeight="{Binding Path=Weight}" FontStyle="{Binding Path=Style}"
    				Foreground="{Binding Path=Couleur}" FontSize="12"/>
    		</DataTemplate>
    	</sdk:DataGrid.Resources>
    	<sdk:DataGrid.Columns>
    		<sdk:DataGridTemplateColumn Header="Mon objet" CellTemplate="{StaticResource FontTpl}" Width="*"/>
    	</sdk:DataGrid.Columns>
    </sdk:DataGrid>

  5. #5
    Membre éprouvé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2012
    Messages : 116
    Par défaut
    Ok je vois.

    Donc, au lieu de binder sur un converter et un attribut, je bind chaque type de "font" sur un attribut propre.
    Je vois que dans ton exemple tu ajoutes un datatemplate, puis un textblock pour binder sur la valeur.

    Ne puis je pas simplement ajouter les 3 "font" à ma datagridColumn? Ou dois je forcement passer par un textblock pour pouvoir effectuer mes changements?

    Edit : En fait, l’inconvénient avec cette méthode c'est que tu dois faire un template par colonne de datagrid. Mais cela fonctionne malgré tout(copier/coller en changeant le binding).

    Merci pour ton aide.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2013
    Messages : 19
    Par défaut
    Oui tu n'es pas obligé, effectivement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <sdk:DataGrid.Columns>
    	<sdk:DataGridTextColumn Header="Objet" Binding="{Binding Libelle}">
    		<sdk:DataGridTextColumn.ElementStyle>
    			<Style TargetType="TextBlock">
    				<Setter Property="FontWeight" Value="{Binding Weight}"/>
    				<Setter Property="FontStyle" Value="{Binding Style}"/>
    				<Setter Property="Foreground" Value="{Binding Couleur}"/>
    			</Style> 
    		</sdk:DataGridTextColumn.ElementStyle>
    	</sdk:DataGridTextColumn>
    </sdk:DataGrid.Columns>
    Enfin, content que ça t'ait aidé à résoudre le problème.

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

Discussions similaires

  1. Appliquer un filtre sur une colonne d'un DataGrid
    Par Invité dans le forum Windows Presentation Foundation
    Réponses: 5
    Dernier message: 24/05/2011, 12h42
  2. Réponses: 5
    Dernier message: 14/03/2008, 17h01
  3. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29
  4. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 14h16
  5. Check sur une colonne de table "en cours"
    Par in dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/07/2003, 09h47

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