40

如何更改 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.  

我看到我可以为每个按钮单独设置文本换行,但这非常愚蠢。我怎样才能把它作为一种风格?什么是神奇的词?

为了将来参考,我在哪里可以找到这些神奇单词的列表,这样我就可以自己做这件事了?当我试图找出 setter 可以设置哪些属性时,MSDN 条目毫无用处。

4

6 回答 6

64

用一个例子来扩展埃里克的答案: -

<Button Name="btnName" Width="50" Height="40">
   <TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>
于 2013-09-19T01:21:22.350 回答
46

我通过向TextBlock按钮添加 a 并使用它来显示按钮文本而不是按钮的Content属性来解决这个问题。确保将TextBlock的 height 属性设置为Auto,以便它在高度上增长以适应换行时的文本行数。

于 2010-12-17T01:08:31.423 回答
32

您的第二个版本应该可以工作,并且对我有用,但需要注意的是您需要更改 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 属性)。没有“神奇的词”,只有依赖属性的名称。

于 2009-04-15T23:45:47.073 回答
8
<Style TargetType="Button">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
于 2017-07-11T21:25:25.667 回答
5

以下是 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
};
于 2014-08-30T18:47:45.787 回答
0

用@fadden 的评论扩展@Rob 的答案:

<Button Width="50" Height="40">
   <AccessText Text="_Some long text" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>

TextBlock 控件不支持键盘热键 (_)。

于 2021-11-01T07:52:18.040 回答