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

Многострочный текст в кнопке WPF

Как получить многострочный текст на WPF-кнопке, используя только С#? Я видел примеры использования <LineBreak/> в XAML, но мои кнопки полностью создаются в С#. Число и метки на кнопках соответствуют значениям в модели домена, поэтому я не думаю, что могу использовать XAML, чтобы указать это.

Я попробовал наивный подход ниже, но он не работает.

Button b = new Button();
b.Content = "Two\nLines";

или

b.Content = "Two\r\nLines";

В любом случае все, что я вижу, это первая строка ( "Два" ) текста.

4b9b3361

Ответ 1

Оказывается, "\n" отлично работает. Моя сетка имела фиксированный размер, и на кнопке нет визуальной индикации, что имеется больше текста (например, нет "..." с указанием отсечки). Когда я щедро расширил размер моей сетки, текст кнопки появился в двух строках.

Ответ 2

ИЛИ в XAML напрямую:

<Button>
   <TextBlock>Two<LineBreak/>Lines</TextBlock>  
</Button>

Ответ 3

Я предпочитаю этот способ:

<Button Width="100">
  <TextBlock TextWrapping="Wrap">This is a fairly long button label</TextBlock>
</Button>

это сработало для меня.

Ответ 4

Ответ очень прост. Просто используйте &#xa;, чтобы ввести разрыв строки, т.е.:

<Button Content="Row 1 Text &#xa; Row 2 Text"/>

Ответ 5

Есть несколько способов сделать это с помощью XAML:

  • Добавьте TextBlock с прерыванием строки:
<Button>     
    <TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock>
</Button>
  1. Добавьте текст в текст:

Этот метод прост, но нет возможности легко управлять выравниванием текста:

    <Button Content="Line 1 &#xa; Line 2"/>
  1. Добавить текстовый блок и обернуть текст

Как только размер кнопок будет меньше размера TextBlocks, он просто разделит содержимое на две строки или более автоматически

<Button>
  <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
</Button>
  1. Использование StackPanel в вашей Button и добавление каждой строки в виде текста Блок:
<Button>
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
  1. Используйте сетку в вашей кнопке:
<Button>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
            <TextBlock Text="Line1" HorizontalAlignment="Center"/>
            <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </Grid>
</Button>
  • Я уверен, что существует еще много, список в основном по порядку от большинства к наименее любимым.

Ответ 6

Так мы делаем это здесь, это также позволяет легко центрировать

<Button Height="40" Width="75">
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>

Ответ 7

Вы пробовали это?

b.Content = new TextBlock { 
    Text = "Two\lLines", 
    TextWrapping = TextWrapping.Wrap };

Если это не сработает, вы можете попробовать добавить StackPanel в качестве дочернего элемента и добавить к нему два элемента TextBlock.

Ответ 8

Как насчет:

TextBlock textBlock = new TextBlock();
textBlock.Inlines.Add("Two");
textBlock.Inlines.Add(new LineBreak());
textBlock.Inlines.Add("Lines");
Button button = new Button();
button.Content = textBlock;

Если вы используете С# 3, вы можете сделать это немного опрятным:

Button button = new Button
{
    Content = new TextBlock { Inlines = { "Two", new LineBreak(), "Lines" } }
};

Ответ 9

У меня была такая же проблема.

Я пробовал:
- button.content = "Line1\nLine2" (не работает, может, я сделал что-то не так),
- заменить текст кнопки на новую метку (не позволяет выравнивать текст по центру),
- заменить текст кнопки текстовым блоком (я думаю, это позволяет центрировать выравнивание текста, но не обертывать его);

Я видел ответы, в которых упоминалось использование стековых панелей или сеток.
Я видел ответы, говорящие не использовать Textbox.

Несмотря на то, что OP говорит, что работает \n, я не думаю, что это путь, по-моему, вы просто грубо заставляете контроль делать то, что хотите, и если в любой момент вы необходимо изменить текст, который вам нужно будет поместить, и проверить, правильно ли завершен текст или если \n должен находиться в другой позиции.
То, что я нашел лучшим способом (мне), - это заменить содержимое кнопки текстовым полем (вы можете просто перетащить, не нужно возиться с XAML) и установить следующие свойства, как указано: IsReadOnly = true,
Focusable = false (необязательно);
Я думаю, что Focusable = false не позволяет пользователю выбирать текст, даже если он не может его редактировать, я не хочу, чтобы он даже выбирал его (личный вкус).

Это приведет к тому, что текстовое поле будет похоже на метку, но с тем преимуществом, которое позволяет центрировать выравнивание текста.

Ответ 10

<Button 
                    Command="{Binding DeliveryDateCommand}"
                    x:Name="cntlbtnf5"
                     Background="White" 
                    BorderBrush="#FFABADB3" 
                      Grid.Column="4"  
                     >
                    <Border BorderBrush="{x:Null}" Height="Auto">
                        <TextBlock Text="Ctrl + F5
                                   Delivery BillDate"
                                   TextWrapping="Wrap"
                                   Width="110"
                                    TextAlignment="Center" 
                                   Height="44"
                                   />

                    </Border>
                </Button>