如何在一个方形按钮中拉伸文本?
问题描述:
在我的应用程序中,我有一个方形按钮的网格。每个按钮的文本内容都是在运行时设置的。在大多数情况下,文本只有一个字符,但有时候会更长。我需要让整个文本始终可见,即将其拉伸(改变字体大小)以适应按钮的边框。我该怎么做?如何在一个方形按钮中拉伸文本?
我试图使用Viewbox,但它没有帮助。
我的XAML的简化版本:
<Viewbox Stretch="Uniform">
<Button Content="Text"
Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}"/>
</Viewbox>
我如何能实现我需要什么(即方形按钮总适合在+文字)任何想法?
答
你原来的建议是接近正确的,试试这个:
<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
任何原因[UniformGrid](http://www.wpftutorials.com/2011/03/wpf-uniformgrid .html)不起作用?你的字体不会动态改变,你需要通过将适当的属性绑定到你调整的东西来增加它。 – 2012-02-17 21:52:26
我已经在使用UniformGrid来按住按钮,但这只是使它们成为_same size_,而不是_square_。 – agnes 2012-02-18 08:53:27