2012-02-17 13 views
7

W mojej aplikacji mam siatkę kwadratowych przycisków. Treść tekstowa każdego przycisku ustawiana jest w czasie wykonywania. W większości przypadków tekst ma tylko jeden znak, ale czasami jest dłuższy. Muszę sprawić, aby cały tekst był zawsze widoczny, tzn. Rozciągnąć go (zmienić rozmiar czcionki) tak, aby zmieścił się wewnątrz obramowania przycisku. Jak mam to zrobić?Jak rozciągnąć tekst w kwadratowym przycisku?

Próbowałem użyć Viewbox, ale to nie pomaga.

Uproszczona wersja mojego XAML:

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

Wszelkie pomysły, w jaki sposób można osiągnąć to, czego potrzebuję (czyli kwadratowe przyciski + tekstowe, które zawsze pasuje)?

+2

jakiegokolwiek powodu [UniformGrid] (http://www.wpftutorials.com/2011/03/wpf-uniformgrid .html) nie działa? Twoja czcionka nie zmieni się dynamicznie, musisz ją zwiększyć, wiążąc odpowiednią właściwość z czymś, co dostosujesz. –

+0

Używam już UniformGrid do trzymania przycisków, ale to sprawia, że ​​mają one _same size_, a nie _square_. – agnes

Odpowiedz

6

Oryginalna propozycja była prawie prawidłowy, spróbuj tego:

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

i zastosować to do wielu przycisków:

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

Moją pierwszą myślą było użyć RenderTransform i konwertera. Daje to taki sam efekt, ale jest bardziej skomplikowana:

<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 

i konwerter

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

Dziękuję, Phil, pierwsze rozwiązanie działa idealnie! – agnes

Powiązane problemy