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

时间:2012-02-17 21:49:55

标签: wpf xaml viewbox

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

我尝试使用Viewbox,但它无济于事。

我的XAML的简化版本:

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

关于如何实现我需要的任何想法(即方形按钮+总是适合的文字)?

1 个答案:

答案 0 :(得分:7)

你原来的建议几乎是正确的,试试这个:

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