WPF кнопка textwrap стиль - PullRequest
       14

WPF кнопка textwrap стиль

28 голосов
/ 16 апреля 2009

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

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

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

Ответы [ 5 ]

41 голосов
/ 19 сентября 2013

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

<Button Name="btnName" Width="50" Height="40">
   <TextBlock Text="Some long text" TextWrapping="Wrap" TextAlignment="Center"/>
</Button>
39 голосов
/ 17 декабря 2010

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

27 голосов
/ 16 апреля 2009

Ваша вторая версия должна работать и работает для меня с оговоркой, что вам нужно изменить привязку 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 с помощью стиля, заключается в том, что у Button нет свойства зависимости TextWrapping (или вообще никакого свойства TextWrapping). Здесь нет «волшебных слов», только имена свойств зависимостей.

5 голосов
/ 12 июля 2017
<Style TargetType="Button">
    <Setter Property="ContentTemplate">
        <Setter.Value>
            <DataTemplate>
                <TextBlock Text="{TemplateBinding Content}" TextWrapping="Wrap" />
            </DataTemplate>
        </Setter.Value>
    </Setter>
</Style>
4 голосов
/ 30 августа 2014

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