2012-02-17 12 views
7

En mi aplicación, tengo una cuadrícula de botones cuadrados. El contenido de texto para cada botón se establece en tiempo de ejecución. En la mayoría de los casos, el texto tiene solo un carácter, pero a veces es más largo. Necesito hacer que todo el texto esté siempre visible, es decir, estirarlo (cambiar el tamaño de la fuente) para que quepa dentro del borde del botón. ¿Cómo lo hago?¿Cómo estirar texto en un botón cuadrado?

Traté de usar un Viewbox, pero no ayuda.

Una versión simplificada de mi XAML:

<Viewbox Stretch="Uniform"> 
    <Button Content="Text" 
      Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/> 
</Viewbox> 

Alguna idea sobre cómo puedo lograr lo que necesito (es decir, los botones cuadrados + texto que cabe siempre en)?

+2

algún motivo un [UniformGrid] (http://www.wpftutorials.com/2011/03/wpf-uniformgrid .html) no funcionaría? Su fuente no va a cambiar dinámicamente, tendrá que aumentarla vinculando la propiedad apropiada a algo que ajuste. –

+0

Ya estoy usando UniformGrid para mantener los botones, pero eso simplemente los convierte en _same size_, not _square_. – agnes

Respuesta

6

Su sugerencia original era casi correcto, intente esto:

<Button> 
     <Viewbox Stretch="Fill"> 
      <TextBlock Text="Test"/> 
     </Viewbox> 
    </Button> 

Y a aplicar esto a varios botones:

<Style x:Key="StretchedButtonContent" TargetType="{x:Type Button}"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <Viewbox Stretch="Fill"> 
         <ContentPresenter Content="{TemplateBinding Content}"/> 
        </Viewbox> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <Button Style="{StaticResource StretchedButtonContent}" Content="Test" /> 

Mi primera idea fue utilizar un RenderTransform y un convertidor. Esto le da el mismo resultado, pero es más complicado:

<Converters:ScaleConverter x:Key="ScaleConverter" /> 

    <Button> 
     <TextBlock Text="Test" RenderTransformOrigin="0.5,0.5"> 
      <TextBlock.RenderTransform> 
       <ScaleTransform> 
        <ScaleTransform.ScaleX> 
        <MultiBinding Converter="{StaticResource ScaleConverter}"> 
         <Binding RelativeSource="{RelativeSource AncestorType={x:Type Button}}" Path="ActualWidth" /> 
         <Binding RelativeSource="{RelativeSource AncestorType={x:Type TextBlock}}" Path="ActualWidth" /> 
        </MultiBinding> 
        </ScaleTransform.ScaleX> 
        <ScaleTransform.ScaleY> 
        <MultiBinding Converter="{StaticResource ScaleConverter}"> 
         <Binding RelativeSource="{RelativeSource AncestorType={x:Type Button}}" Path="ActualHeight" /> 
         <Binding RelativeSource="{RelativeSource AncestorType={x:Type TextBlock}}" Path="ActualHeight" /> 
        </MultiBinding> 
        </ScaleTransform.ScaleY> 
       </ScaleTransform> 
      </TextBlock.RenderTransform> 
     </TextBlock> 
    </Button 

y un convertidor

public class ScaleConverter : IMultiValueConverter 
{ 
    #region Implementation of IMultiValueConverter 

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((double) values[0])/((double) values[1]); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 
+0

Gracias Phil, ¡la primera solución funciona perfectamente! – agnes

Cuestiones relacionadas