2010-01-06 11 views
7

J'ai un Viewbox avec un nombre de TextBlock qui sont mis à l'échelle et positionnés parfaitement par le ViewBox. Quelque chose comme ceci:Comment conserver une constante FontSize dans WPF Viewbox?

<Viewbox Stretch="Uniform"> 
    <Canvas Width="100" Height="100"> 
     <Ellipse Width="100" Height="100" Stroke="Black"/> 
     <TextBlock Width="100" TextAlignment="Center" FontSize="12">Top Center</TextBlock> 
    </Canvas> 
</Viewbox> 

Si l'utilisateur redimensionne les Viewbox son contenu sont parfaitement mis à l'échelle pour correspondre. Cependant, je voudrais garder le FontSize à 12 indépendamment de la taille réelle du Viewbox.

Comment est-ce que je peux faire ceci? Puis-je le faire en XAML sans attacher à un événement Resize?

Répondre

10

ViewBox ne vous permettra pas de garder une taille de police constante, ce n'est tout simplement pas comment cela fonctionne. Vous avez besoin de mettre le texte en dehors de la zone de vue pour que cela se produise:

<Grid> 
    <Viewbox Stretch="Uniform"> 
     <Canvas Width="100" Height="100"> 
      <Ellipse Width="100" Height="100" Stroke="Black"/> 
     </Canvas> 
    </Viewbox> 
    <TextBlock TextAlignment="Center" FontSize="12">Top Center</TextBlock> 
</Grid> 

Notez que j'ai enlevé la propriété Largeur du TextBlock, je viens de le laisser étirer la largeur de la grille, laissant l'alignement du texte prendre soin du centrage.

Ou, vous pouvez faire preuve de créativité et de lier la propriété FontSize à la ActualWidth du ViewBox et l'avoir mis à l'échelle appropriée, par exemple:

Converter:

class ViewBoxConstantFontSizeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (!(value is double)) return null; 
     double d = (double)value; 
     return 100/d * 12; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException(); 
    } 
} 

Utilisation:

<Window.Resources> 
    ... 
    <local:ViewBoxConstantFontSizeConverter x:Key="conv"/> 
</Window.Resources> 
... 
<Viewbox Name="vb" Stretch="Uniform"> 
    <Canvas Width="100" Height="100"> 
     <Ellipse Width="100" Height="100" Stroke="Black"/> 
     <TextBlock Width="100" TextAlignment="Center" 
        FontSize="{Binding ElementName=vb, 
             Path=ActualWidth, 
             Converter={StaticResource conv}}"> 
      Top Center 
     </TextBlock> 
    </Canvas> 
</Viewbox> 
+1

Merci. Je suppose que j'ai simplifié un peu trop mon exemple. J'ai besoin de la Viewbox pour prendre soin de la position de mon texte, mais pas de FontSize. – Hallgrim

+1

Ajout d'une alternative à ma réponse, essayez-le. C'est un peu trop créatif, mais ça pourrait marcher :) –

+0

Impressionnant! Cela a fonctionné, mais j'espérais quelque chose d'un peu plus simple. – Hallgrim

7

Cela peut être une solution facile aussi.

<Viewbox StretchDirection="DownOnly" > 
    <Label Content="Enable" FontSize="10" FontStretch="Normal" /> 
</Viewbox>