Многострочный текст в кнопке WPF
Как получить многострочный текст на WPF-кнопке, используя только С#? Я видел примеры использования <LineBreak/>
в XAML, но мои кнопки полностью создаются в С#. Число и метки на кнопках соответствуют значениям в модели домена, поэтому я не думаю, что могу использовать XAML, чтобы указать это.
Я попробовал наивный подход ниже, но он не работает.
Button b = new Button();
b.Content = "Two\nLines";
или
b.Content = "Two\r\nLines";
В любом случае все, что я вижу, это первая строка ( "Два" ) текста.
Ответы
Ответ 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
Ответ очень прост. Просто используйте 

, чтобы ввести разрыв строки, т.е.:
<Button Content="Row 1 Text 
 Row 2 Text"/>
Ответ 5
Есть несколько способов сделать это с помощью XAML:
- Добавьте TextBlock с прерыванием строки:
<Button>
<TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock>
</Button>
- Добавьте текст в текст:
Этот метод прост, но нет возможности легко управлять выравниванием текста:
<Button Content="Line 1 
 Line 2"/>
- Добавить текстовый блок и обернуть текст
Как только размер кнопок будет меньше размера TextBlocks, он просто разделит содержимое на две строки или более автоматически
<Button>
<TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
</Button>
- Использование StackPanel в вашей Button и добавление каждой строки в виде текста
Блок:
<Button>
<StackPanel>
<TextBlock Text="Line1" HorizontalAlignment="Center"/>
<TextBlock Text="Line2" HorizontalAlignment="Center"/>
</StackPanel>
</Button>
- Используйте сетку в вашей кнопке:
<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>