如何在WPF中更改按钮的默认文本换行样式?
显而易见的解决方案:
<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
<Setter Property="TextWrapping" Value="Wrap"></Setter>
</Style>
不起作用,因为Textwrapping显然不是一个可设置的属性。
如果我尝试:
<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我只是从编译器得到一个毫无价值的回应:
Error 5 After a 'SetterBaseCollection' is in use (sealed), it cannot be modified.
删除ControlTemplate标记可以防止错误。
以下尝试会产生不同的错误:
<Setter Property="TextBlock">
<TextBlock Text="{Binding}" Foreground="White" FontSize="20" FontFamily="Global User Interface" TextWrapping="Wrap"/>
</Setter>
Error 5 The type 'Setter' does not support direct content.
我看到我可以单独为每个按钮设置文本换行,但这非常as。。我该怎么做才能成为一种风格?什么是神奇的词?
为了将来参考,我在哪里可以找到这些神奇单词的列表,所以我可以自己做这个?当我试图找出setter可以设置哪些属性时,MSDN条目是没用的。
答案 0 :(得分:41)
用一个例子来扩展Eric的答案: -
<Button Name="btnName" Width="50" Height="40">
<TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>
答案 1 :(得分:39)
我通过向按钮添加TextBlock
并使用它来显示按钮文本而不是按钮的Content
属性来解决了这个问题。请务必将TextBlock
的高度属性设置为Auto
,以使其在高度上增长,以适应包装时的文本行数。
答案 2 :(得分:27)
您的第二个版本应该可行,并且对我而言,需要更改TextBlock文本绑定的警告:
<!-- in Window.Resources -->
<Style x:Key="fie" TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<TextBlock Text="{TemplateBinding Content}" FontSize="20" TextWrapping="Wrap"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- then -->
<Button Style="{StaticResource fie}">verylongcaptiongoeshereandwraps/Button>
请注意,这完全取代了按钮样式(例如,如果需要,您需要创建自己的按钮镶边)。
关于第二个问题,可以使用Setter设置所有可写的依赖项属性。您无法通过样式在Button上设置TextWrapping的原因是Button没有TextWrapping依赖项属性(或实际上任何TextWrapping属性)。没有“魔术词”,只有依赖属性的名称。
答案 3 :(得分:5)
<Style TargetType="Button">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
答案 4 :(得分:4)
以下是Eric在C#代码隐藏中的回答示例:
var MyButton = new Button();
MyButton.Content = new TextBlock() {
FontSize = 25,
Text = "Hello world, I'm a pretty long button!",
TextAlignment = TextAlignment.Center,
TextWrapping = TextWrapping.Wrap
};