如何在一个方形按钮中拉伸文本?

问题描述:

在我的应用程序中,我有一个方形按钮的网格。每个按钮的文本内容都是在运行时设置的。在大多数情况下,文本只有一个字符,但有时候会更长。我需要让整个文本始终可见,即将其拉伸(改变字体大小)以适应按钮的边框。我该怎么做?如何在一个方形按钮中拉伸文本?

我试图使用Viewbox,但它没有帮助。

我的XAML的简化版本:

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

我如何能实现我需要什么(即方形按钮总适合在+文字)任何想法?

+2

任何原因[UniformGrid](http://www.wpftutorials.com/2011/03/wpf-uniformgrid .html)不起作用?你的字体不会动态改变,你需要通过将适当的属性绑定到你调整的东西来增加它。 – 2012-02-17 21:52:26

+0

我已经在使用UniformGrid来按住按钮,但这只是使它们成为_same size_,而不是_square_。 – agnes 2012-02-18 08:53:27

你原来的建议是接近正确的,试试这个:

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

而且这种应用到多个按钮:

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

我首先想到的是使用的RenderTransform和转换器。这给出了相同的结果,但是更复杂:

<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 

和转换器

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

谢谢菲尔,第一个解决方案完美无缺! – agnes 2012-02-18 08:52:06