Многострочный текст в кнопке WPF - PullRequest
60 голосов
/ 19 сентября 2009

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

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

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

или

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

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

Ответы [ 10 ]

92 голосов
/ 09 апреля 2010

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

<Button>
   <TextBlock>Two<LineBreak/>Lines</TextBlock>  
</Button>
46 голосов
/ 19 декабря 2012

Я предпочитаю так:

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

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

33 голосов
/ 26 июня 2015

Ответ очень прост. Просто введите &#xa;, чтобы ввести перенос строки, т.е.

<Button Content="Row 1 Text &#xa; Row 2 Text"/>
17 голосов
/ 19 октября 2015

Есть несколько способов сделать это через XAML:

  1. Добавить 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>
    <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>
  • Я уверен, что еще много существует, список в основном в порядке от самых до наименее любимых.
11 голосов
/ 10 июля 2014

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

<Button Height="40" Width="75">
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
8 голосов
/ 20 сентября 2009

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

5 голосов
/ 19 сентября 2009

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

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

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

4 голосов
/ 19 сентября 2009

Как насчет:

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

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

Button button = new Button
{
    Content = new TextBlock { Inlines = { "Two", new LineBreak(), "Lines" } }
};
0 голосов
/ 04 декабря 2018

Попробуйте код ниже:

<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>
0 голосов
/ 07 мая 2017

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...