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


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

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

Button b = new Button();
b.Content = "TwonLines";

или

b.Content = "TwornLines";

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

9 54

9 ответов:

или в XAML напрямую:

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

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

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

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

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

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

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

  1. добавить текстовый блок с разрывом строки:
<Button>     
    <TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock>
</Button>
  1. добавить разрыв строки в текст:

этот метод прост, но нет никакого способа, чтобы легко контролировать выравнивание текста:

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

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

<Button>
  <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
</Button>
  1. используйте can 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>
  • Я уверен, что существует еще много, список в основном в порядке от большинства до наименее любимых.

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

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

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

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

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

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

Как насчет:

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

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

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

Я видел ответы говорить об использовании stackpanels или сеток.
Я видел ответы, говорящие не использовать поле.

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

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