Стиль textwrap кнопки WPF

как изменить стиль textwrapping по умолчанию кнопки в 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.  

Я вижу, что я могу установить textwrapping для каждой кнопки отдельно, но это довольно глупо. Как я могу сделать это как стиль? Что это за волшебные слова?

и для дальнейшего использования, где я могу найти список этих волшебных слов, чтобы я мог сделать это самостоятельно? Запись MSDN довольно бесполезна, когда я пытаюсь узнать, какие свойства могут быть установлены сеттером.

5 ответов


ваша вторая версия должна работать и делает для меня, с оговоркой, что вам нужно изменить привязку текста 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>

обратите внимание, что это полностью заменяет стиль кнопки (т. е. вам нужно будет создать свой собственный chrome кнопки, если вы хотите его).

что касается вашего второго вопроса, все записи свойства зависимостей могут быть установлены с помощью сеттеров. Причина, по которой Вы не смогли установить TextWrapping на кнопке через стиль, заключается в том, что кнопка не имеет Свойство зависимости TextWrapping (или любое свойство TextWrapping). Нет никаких "волшебных слов", только имена свойств зависимостей.


чтобы расширить ответ Эрика примером: -

<Button Name="btnName" Width="50" Height="40">
   <TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>

Я решил эту проблему путем добавления TextBlock кнопки, и использовать его для отображения текста кнопки вместо кнопки Content собственность. Обязательно установите TextBlock's высота свойство Auto, Так что он растет в высоту, чтобы вместить количество строк текста, как он обтекает.


вот пример ответа Эрика в коде 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
};

<Style TargetType="Button">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>