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

8
在我的应用程序中,我有一个正方形按钮的网格。每个按钮的文本内容是在运行时设置的。在大多数情况下,文本只有一个字符长,但有时它会更长。我需要使整个文本始终可见,即拉伸它(更改字体大小)以适应按钮的边框。我该如何做?
我尝试使用Viewbox,但没有帮助。
我的XAML的简化版本:
<Viewbox Stretch="Uniform">
    <Button Content="Text" 
            Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/>
</Viewbox>

有没有关于如何达到我需要的效果(即正方形按钮+文本始终适合)的想法?

2
有什么原因 UniformGrid 不能使用吗?您的字体不会动态更改,您需要通过将适当的属性绑定到您调整的内容来增加它。 - Aaron McIver
我已经在使用UniformGrid来容纳按钮,但那只会让它们成为“相同大小”,而不是“正方形”。 - agnes
1个回答

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
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接