Style DataGridCell correctement
C'est une question suite à mon précédent problème, vous pouvez le trouver là
. Maintenant, j'ai défini une DataGrid
avec un ElementStyle
pour chaque colonne (qui ne définit que l' TextBlock
s à l'intérieur en gras & blanc-viennent sur ce problème plus tard)
Alors maintenant, j'ai deux questions
Première question (résolu)
Quand j'arrive à définir un arrière-plan de ma cellule, il remplace le style par défaut, et le fond reste le même lorsque la cellule est mise en surbrillance.
Un exemple d'un style:
<!-- Green template for market-related -->
<ControlTemplate x:Key="Green" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="Green">
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
J'avais naturellement dire que c'est "normal" car j'ai mis le Grid
'arrière-plan Vert. J'ai donc essayé de cette façon:
<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
<Grid Background="LightGreen">
<Grid.Resources>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}},
Converter={StaticResource DebugConverter}}" Value="True">
<Setter Property="Grid.Background" Value="#FF3774FF" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
Cela ne fonctionne pas non plus. Comme vous pouvez le voir j'ai mis un DebugConverter afin que je puisse vérifier que le déclencheur est en fait appelée, ce qui est le cas, mais... le Fond ne change pas (et Snoop le confirme...)
Troisième essai:
<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
<ControlTemplate.Resources>
<Style TargetType="{x:Type tk:DataGridCell}">
<Setter Property="Background" Value="LightGreen" />
</Style>
</ControlTemplate.Resources>
<Grid>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
Et... Pas d'arrière-plan sera affiché (reste transparent)
Donc je pense que je suis en train de travailler dans le mauvais sens ici et je me demandais ce que je dois faire pour définir SIMPLEMENT la "non sélectionné" modèle.
Je dirais que j'ai peut-être besoin de définir un style Basée le style "classique" mais, comment dois-je procéder? J'ai essayé d'ajouter TemplateBindings sans succès
** EDIT:**
Que H B a suggéré dans sa réponse, le problème venait de DependencyProperty Priorité, voici la solution:
<!-- Light green template for sophis-related -->
<ControlTemplate x:Key="LightGreen" TargetType="{x:Type tk:DataGridCell}">
<Grid>
<Grid.Resources>
<Style TargetType="{x:Type Grid}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}},
Converter={StaticResource DebugConverter}}" Value="True">
<Setter Property="Grid.Background" Value="#FF316AC5" />
</DataTrigger>
<DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}},
Converter={StaticResource DebugConverter}}" Value="False">
<Setter Property="Grid.Background" Value="LightGreen" />
</DataTrigger>
</Style.Triggers>
</Style>
</Grid.Resources>
<ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
</Grid>
</ControlTemplate>
Deuxième question
Maintenant, nous allons parler Triggers
.
Fondamentalement, ce que je veux faire est de définir la spécificité de Triggers
à mon ElementStyle
de sorte que la police, la couleur est blanc si la cellule arrière-plan est Rouge ou Vert (le seul objectif est d'avoir une meilleure lisibilité comme le Rouge et le Vert sont un peu sombres, police noire sur fond sombre résultats dans un joli fail :p )
Modifier Semble que je ne suis pas assez clair: le style suivant est le style appliqué à chaque élément de la grille de données, par le biais de la propriété DataGridTextColumn.ElementStyle
. Voici le code de la manipulation:
void VolatilityDataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
DataGridTextColumn column = e.Column as DataGridTextColumn;
column.ElementStyle = s_boldCellStyle;
//Other stuff here...
}
Voici ce que je fais:
<!-- Cell style for colored matrix-->
<Style x:Key="BoldCellStyle" TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}}}"
Value="Red">
<Setter Property="Foreground" Value="White" />
</DataTrigger>
<DataTrigger Binding="{Binding Background, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type tk:DataGridCell}},
Converter={StaticResource DebugConverter}}"
Value="Green">
<Setter Property="Foreground" Value="White" />
</DataTrigger>
</Style.Triggers>
<Setter Property="FontWeight" Value="Bold"/>
</Style>
Et... Ça ne fonctionne pas. Étrangement, ce qui passe par le convertisseur est SEULEMENT transparent couleurs d'arrière-plan. Je suis vraiment manqué quelque chose!
BTW, j'ai aussi essayé avec classique déclenche, sans succès non plus, j'utilise DataTriggers
ici, ce qui me permet de déboguer les valeurs contraignantes!
Maintenant, j'ai été bloqué pendant plus de trois jours, et je suis en train de capoter... j'espère que la Stackoverflow communauté va me sauver 🙂
Merci!
Modifier
Ok, mise à jour.
J'ai compris pourquoi mon Trigger
ne fonctionne pas. L'arrière-plan fait est sur le Grid
et PAS sur le DataGridCell
. Il est donc normal que je n'ai pas toutes les couleurs ensemble.
Cependant, j'ai couru quelques tests et constaté que, lorsque la liaison est définie, le TextBlock
n'a pas de parent (Parent
= null). La liaison à un RelativeSource
de type Grid
va me lient à... l'ensemble de La DataGrid
éléments de l'animateur.
Je ne sais pas quoi faire maintenant, car il semble être que de la réelle TextBlock
style je ne peux pas atteindre le parent Grid
et, par conséquent, ne peut pas résoudre de quelle couleur dois-je afficher selon le contexte.
Aussi, je ne peux pas changer la couleur de Police dans mon ControlTemplate
parce que le DataGrid
veut un Style
pour chaque colonne, qui remplace le modèle du style par défaut (voir ma précédente question, et sa réponse)
Donc... Coincé de nouveau je suis!
OriginalL'auteur Damascus | 2011-08-18
Vous devez vous connecter pour publier un commentaire.
Propriété De Dépendance Priorité De La Valeur De
Ce:
Doit être:
Pas sûr à propos de votre deuxième question, à compter de maintenant, peut-être un problème lié, je suggère de réglage
TextElement.Foreground
au lieu deForeground
pour les débutants. ObtenirTransparent
que la valeur n'est pas très utile, ce modèle de contrôle utilisez-vous pour laDataGridCell
? Si c'est la coutume, est leBackground
branché correctement via unTemplateBinding
?Cela fonctionne tant que la
Background
propriété est utilisée, donc si vous avez unControlTemplate
qui met les choses en interne, vous avez besoin d'extérioriser. NormalDataGrid
exemple:Donc, si le
CellStyle
définit laControlTemplate
les propriétés besoin d'être connectés via objet templatebinding. par exemple,Ne pas faire de déclenchement à l'intérieur du modèle, ou il va être très salissant.
TextBlock
s, alors je devrais vraiment travailler avecTextElement.Foreground
? Je suis d'édition de la question parce que j'ai trouvé ce qui est peut-être la cause-ce qui peut poser un nouveau problème encore plus compliqué :/Le fait qu'au début, il n'y a aucun parent ne devrait pas être problématique. Je ne comprends toujours pas où vous utilisez le style et la manière dont il interagit avec les autres composantes cependant, votre question a besoin de plus de contexte à ce sujet.
Oups, désolé, juste de mettre à jour la question, le style est utilisé comme un
DataGridTextColumn.ElementStyle
, check this out 🙂Mise à jour de ma réponse, peut-être ce qui le rend plus clair...
De se! Vous avez tout à fait raison, d'extériorisation était la solution. Merci beaucoup!
OriginalL'auteur H.B.