在我的应用程序中,我有一个特定大小的按钮,我不想改变。按钮的内容最初为“0”,每当有人按下按钮时,按钮的内容增加1,例如, 3次按下后,内容将为“3”。
然而,经过这么长时间,内容变得太大(比如100)以适应按钮,它的结尾将完全消失在按钮的边缘。我希望能够做的是让文本重新调整大小并在需要时变小,以便它全部保留在按钮内但会保持其最大大小。
我正在寻找类似于那些计算器的东西,随着数字的增加,它们变小,所以整数可以适应。
但是我不想改变按钮的尺寸,它们需要保持完全相同。我将内容拟合到按钮的大小,而不是将按钮的大小调整为内容。
我对任何解决方案或解决方法都持开放态度。
答案 0 :(得分:1)
您必须覆盖Template
中的按钮Style
并使用ContentPresenter
包裹ViewBox
。
以下是示例(查找Viewbox added
评论):
<Style x:Key="ButtonWithViewbox" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="Grid" Background="Transparent">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition From="Pressed" To="PointerOver">
<Storyboard>
<PointerUpThemeAnimation Storyboard.TargetName="Grid"/>
</Storyboard>
</VisualTransition>
<VisualTransition From="PointerOver" To="Normal">
<Storyboard>
<PointerUpThemeAnimation Storyboard.TargetName="Grid"/>
</Storyboard>
</VisualTransition>
<VisualTransition From="Pressed" To="Normal">
<Storyboard>
<PointerUpThemeAnimation Storyboard.TargetName="Grid"/>
</Storyboard>
</VisualTransition>
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal"/>
<VisualState x:Name="PointerOver"/>
<VisualState x:Name="Pressed">
<Storyboard>
<PointerDownThemeAnimation Storyboard.TargetName="Grid"/>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedForegroundThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="Border">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonPressedBackgroundThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="Disabled">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Foreground" Storyboard.TargetName="ContentPresenter">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonDisabledForegroundThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="BorderBrush" Storyboard.TargetName="Border">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonDisabledBorderThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Background" Storyboard.TargetName="Border">
<DiscreteObjectKeyFrame KeyTime="0" Value="{ThemeResource ButtonDisabledBackgroundThemeBrush}"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="Border" CornerRadius="5" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="0" Background="{TemplateBinding Background}">
<Viewbox> /* VIEWBOX ADDED */
<ContentPresenter x:Name="ContentPresenter" AutomationProperties.AccessibilityView="Raw"
ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Viewbox>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 1 :(得分:0)
使用 Viewbox 控件,您可以调整按钮中的内容大小,因为ViewBox旨在填充可用空间,无论大小如何。
第一种方法
<Button Content="Long Text Long Text Long Text Long Text Long Text Long Text" Foreground="Red" Height="30">
<Button.ContentTemplate>
<DataTemplate>
<Viewbox >
<TextBlock Margin="5,0,5,0" Text="{Binding Path=Content,RelativeSource={RelativeSource AncestorType={x:Type Button}}}" ></TextBlock>
</Viewbox>
</DataTemplate>
</Button.ContentTemplate>
</Button>
注意:您也可以使用x:键将此DataTemplate存储在资源中,然后分配到按钮 <Button ContentTemplate={StaticResource DatatemplateKeyname}/>
第二种方法
<Button Height="30" Width="200" Foreground="Red">
<Button.Content>
<Viewbox>
<TextBlock Margin="5,0,5,0" Text="Long Text Long Text Long Text Long Text Long Text Long Text" ></TextBlock>
</Viewbox>
</Button.Content>
</Button>
注意:
您可以在此处使用标记属性来存储内容,然后将其绑定到视图框中的文本块 TextBlock Text="{Binding Path=Tag,RelativeSource={RelativeSource AncestorType={x:Type Button}}}"
第三种方法
<!--Here Width is store in Button "Tag" property.-->
<Viewbox Height="30" Width="{Binding ElementName=Buttonname,Path=Tag}">
<Button x:Name="Buttonname" Content="Long Text Long Text Long Text Long Text Long Text Long Text Long Text Long Text Long Text Long Text Long Text Long Text" Tag="200" Foreground="Red"/>
</Viewbox>