2008-11-26 10 views
3

Je modifie le FontSize du texte dans un déclencheur de style, ce qui entraîne également le contrôle contenant le texte à redimensionner. Comment puis-je changer la taille de police sans affecter la taille du parent?WPF Style Trigger

Répondre

0

Quel type de contrôle utilisez-vous? Si cela est un HeaderedControl comme un GroupBox ou TabItem alors vous devez définir spécifiquement HeaderTemplate comme ceci:

<DataTemplate x:Key="MyHeaderTemplate"> 
    <TextBlock Text="{Binding}" Fontsize="14" FontWeight="Bold" /> 
</DataTemplate> 
0

je peux penser à un couple de choses que vous pouvez essayer:

  • Vous pouvez Remplacer le passage de mesure du contrôle - lorsqu'un contrôle est rendu dans WPF, il subit deux passes. Le premier est un «passage de mesure», où le contrôle arrive avec quelles tailles veut être. La seconde est la «passe d'arrangement», où elle établit réellement le contrôle. WPF fournit une méthode appelée MeasureOverride. Si vous remplacez cette méthode, vous pouvez fournir un comportement personnalisé pouvant être utilisé pour ajuster la taille du contrôle.

    Remarque - Je crois que vous devrez appeler la méthode Measure tous vos contrôles enfants pendant ce remplacement afin d'obtenir votre contrôle de disposer correctement.

  • Code dur la hauteur et la largeur sur le contrôle - cela remplacera le DesiredSize du contrôle avec vos valeurs. Bien que généralement pas une des meilleures idées, cela fonctionnera.

1

Je crée un ControlTemplate pour un ButtonControl il ressemble à une étiquette (texte plat, pas de frontières) avec des déclencheurs pour IsKeyboardFocused, IsPressed, IsDefaulted etc.

Le IsPressed est défini à laisser tomber le FontSize (de 30 par défaut) à 28. Pour donner un effet d'animation pressé.

Une utilisation de ces boutons est un StackPanel horizontal de Button, séparé par des séparateurs verticaux. Lorsque le déclencheur IsPressed est déclenché sur un bouton et qu'il est redimensionné, la rangée entière de boutons est réajustée, ce qui n'est pas un effet visuel agréable.

Ma préférence est pour une solution basée sur un modèle, pour éviter d'introduire de nouveaux contrôles afin de fournir des remplacements. Le seul problème avec l'approche de la taille codée en dur est l'internationalisation, d'autres langues augmenteront la taille originale.

La solution que je vais utiliser est de définir la minWidth en C# après que le DesiredSize du bouton a été calculé. Notez que Width est NaN même après le rendu du bouton, d'où l'utilisation/existence de DesiredSize. Plus tard, je vais essayer et XAMLize le C#.

3

Vous pouvez augmenter la Rembourrage en même temps vous réduisez la FontSize - cela entraînera la hauteur calculée du bouton reste le même:

<StackPanel> 
    <Button Content="ABC"> 
     <Button.Style> 
      <Style TargetType="{x:Type Button}"> 
       <Setter Property="FontSize" Value="20"/> 
       <Style.Triggers> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter Property="FontSize" Value="12"/> 
         <Setter Property="Padding" Value="5"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Style> 
    </Button> 
    <Button Margin="0,20" Content="123" FontSize="20"/> 
    <Button Content="Do Re Mi" FontSize="20"/> 
</StackPanel> 

Vous pouvez faire l'inverse et mettre un Rembourrage négatif si le FontSize augmente également. Vous pouvez également utiliser une liaison de FontSize à Padding pour accomplir la même chose d'une manière générale, mais si vous traitez seulement un ensemble fixe de FontSizes, il serait plus facile de le coder en dur comme ci-dessus.

7

Une belle astuce pour isoler un élément de sa mise en page de parent est sage de placer l'élément dans une toile

Dans le balisage ci-dessous, il y a deux copies de votre élément Le premier est caché et établit la taille de votre contrôle La seconde est visible mais enveloppée dans un canevas, de sorte que sa taille de mise en page n'affecte pas le parent.

<Parent> 
    <Grid> 
    <Element Visibility="Hidden"/> 
    <Canvas> 
     <Element /> 
    </Canvas> 
    <Grid> 
</Parent> 
3

Il n'y a absolument aucun besoin de largeurs codées en dur, de remplacements de mesure fous, de liaisons délicates ou de quoi que ce soit de ce genre.

La solution est en fait incroyablement simple. Au lieu de modifier la taille de la police dans un déclencheur de style, créez un modèle de contrôle simple pour votre bouton avec une RenderTransform appliquée à l'élément de présentation de contenu. Ajoutez une ScaleTransform à RenderTransform. À l'intérieur d'une définition de déclencheur IsPressed, réglez les échelles verticale et horizontale sur ScaleTransform dans un rapport plus petit, soit 0,8.

L'utilisation d'un RenderTransform gardera la mise en page de la touche pressée la même chose avec, donc il ne sera pas influer sur la position des autres éléments. En revanche, en utilisant un LayoutTransform aurait effectivement causé le conteneur de bouton pour rétrécir et la méthode ArrangeOverride du conteneur parent causerait les boutons adjacents de se déplacer pour remplir l'espace supplémentaire.

Je suis juste très occupé maintenant donc je vais laisser la mise en œuvre réelle à vous! ;-)

http://msdn.microsoft.com/en-us/library/system.windows.media.scaletransform.aspx

Questions connexes