2009-12-10 3 views
6

J'ai une bordure en XAML/WPF que j'utilise pour souligner un en-tête de paragraphe entier dans les en-têtes de texte d'une boîte de dialogue. J'ai mis sa propriété BorderThickness à "0,0,0,1". Dans certains endroits, il finit par être rendu avec un soulignement de 2 pixels d'épaisseur tandis que dans d'autres, il apparaît correctement comme un soulignement d'un pixel. Qu'est-ce que je fais mal?BorderThickness de 1 rend avec une épaisseur de 2 pixels - qu'est-ce qui me manque ici?

Voici le modèle de contrôle que je utilise pour remplacer l'arbre visuel de mon étiquette (l'utilisation d'un modèle est sans conséquence, j'ai pensé):

<ControlTemplate x:Key="HeaderTemplate" TargetType="{x:Type Label}"> 
<Border BorderThickness="0,0,0,1" Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Margin}"> 
    <Border.BorderBrush> 
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"> 
     <GradientStop Offset="0" Color="Black"/> 
     <GradientStop Offset="0.6" Color="Black"/> 
     <GradientStop Offset="1" Color="Transparent"/> 
    </LinearGradientBrush> 
    </Border.BorderBrush> 
    <TextBlock Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}" Style="{StaticResource HeaderStyle}" 
      Margin="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Padding}"/> 
</Border> 
</ControlTemplate> 

Je suis assez nouveau pour WPF, donc Je soupçonne qu'il me manque quelque chose de fondamental sur son modèle de rendu.

  • La bordure est-elle rendue au-delà d'une limite de pixels? Cela ne semble pas être le cas, car j'aurais pensé que ce serait partiellement transparent si c'était le cas.
  • Y at-il un moyen de garantir que je reçois ce que je demande en termes d'épaisseur?
  • Ai-je même fait une erreur hurlante?

Et pour référence, je n'applique pas de transformée de mise à l'échelle (ou tout autre type de transformation). Toute aide serait appréciée. :)

Répondre

6

Le nombre de pixels que l'élément prend dépendra de plusieurs facteurs, notamment:

  • Le DPI de l'écran
  • transformations sur l'élément ou l'un de ses ancêtres
  • Lorsqu'il est rendu en relation avec les limites de pixels de l'écran

Les chiffres que vous utilisez doivent être considérés comme étant relatifs plutôt que des valeurs absolues en termes de la façon dont ils sont rendus. Cela dit, WPF 4.0 inclura Layout Rounding que vous pouvez utiliser pour réduire les cas où les lignes censées avoir la même épaisseur sont rendues différemment selon qu'elles franchissent ou non une limite de pixels.

+0

Alors ce que nous disons, pour le moment étant, je dois abandonner mon désir de contrôler les choses aussi strictement que je peux avec, disons, HTML et CSS? :) –

+1

En un mot, oui :) – GraemeF

+0

J'ai travaillé sur un contrôle quelque peu complexe pendant quelques jours et ça me frustre continuellement en étalant les couleurs des bordures, etc. La première question que je regarde a la réponse et, pendant que mon nature obsessionnelle me dit qu'il doit y avoir une solution de rechange, j'apprécie la perspicacité. Je vous remercie! – Brad

Questions connexes