Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Ваша вторая версия должна работать, и для меня это делается с учетом того, что вам нужно изменить привязку TextBlock Text:

<!-- 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, если вы этого захотите).

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

Ответ 2

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

Ответ 3

Чтобы развернуть ответ Эрика на примере: -

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

Ответ 4

Вот пример ответа Эрика в коде С#:

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
};

Ответ 5

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