2010-01-06 9 views
7

Ho un Viewbox con un numero di TextBlock s che sono ridotta e posizionata perfettamente dal ViewBox. Qualcosa di simile a questo:Come mantenere un FontSize costante in 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> 

Se l'utente ridimensiona le Viewbox suoi contenuti sono perfettamente scalati da abbinare. Tuttavia, desidero mantenere lo FontSize su 12 indipendentemente dalle dimensioni effettive dello Viewbox.

Come posso fare questo? Posso farlo in XAML senza collegarmi a un evento Resize?

risposta

10

ViewBox non vi permetterà di mantenere una dimensione di carattere costante, che non è solo come funziona. Hai bisogno di mettere il testo al di fuori della casella di visualizzazione per quel che accada:

<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> 

Si noti che ho rimosso la proprietà Width dal TextBlock, ho appena lasciarlo allungare per la larghezza della griglia, lasciando che l'allineamento del testo prende cura del centraggio.

Oppure, si potrebbe ottenere creativo e associare la proprietà FontSize alla ActualWidth del ViewBox e averlo scalato in modo appropriato, per esempio:

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(); 
    } 
} 

Usage:

<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

Grazie. Immagino di aver semplificato il mio esempio un po 'troppo. Ho bisogno del Viewbox per occuparmi della posizione del mio testo, ma non è FontSize. – Hallgrim

+1

Aggiunta un'alternativa alla mia risposta, provalo. È un po 'eccessivo, ma potrebbe funzionare :) –

+0

Impressionante! Ha funzionato, ma speravo in qualcosa di più semplice. – Hallgrim

7

Anche questa potrebbe essere una soluzione semplice.

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