Стиль обтекания текстом кнопки WPF

Как изменить стиль обтекания текста по умолчанию для кнопки в WPF?

Очевидное решение:

<Style x:Key="MyButtonStyle" TargetType="{x:Type Button}">
    <Setter Property="TextWrapping" Value="Wrap"></Setter>
</Style>

не работает, потому что Textwraping здесь, по-видимому, не является устанавливаемым свойством.

Если я попытаюсь:

<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.  

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

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


person mmr    schedule 15.04.2009    source источник


Ответы (5)


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

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

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

person itowlson    schedule 15.04.2009
comment
Нет, есть волшебные слова. В данном случае волшебными словами были TemplateBinding Content. Спасибо, что дал мне знать. - person mmr; 16.04.2009

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

<Button Name="btnName" Width="50" Height="40">
   <TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>
person Rob    schedule 19.09.2013
comment
У меня не было ширины и высоты кнопки, вместо этого я использовал MaxWidth для текста — ограничивает размер и красиво обтекает! - person imekon; 21.03.2018
comment
Измените TextBlock на AccessText, если вы хотите указать ключи доступа (Text="_Some long text"). - person fadden; 02.03.2020

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

person Eric    schedule 17.12.2010
comment
Это определенно проще/чище, чем принятый ответ, но его способ тоже работает. - person John B; 30.03.2012
comment
См. приведенные ниже ответы для примеров необходимого кода. - person Danny Beckett; 30.08.2014

Вот пример ответа Эрика в коде программной части С#:

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
};
person Danny Beckett    schedule 30.08.2014

person    schedule
comment
Это работает для меня. - person bmi; 12.07.2021