Многострочный текст в кнопке WPF
как получить многострочный текст на кнопке WPF, используя только C#? Я видел примеры использования <LineBreak/>
в XAML, но мои кнопки создаются полностью программно в C#. Число и метки на кнопках соответствуют значениям в модели домена, поэтому я не думаю, что могу использовать XAML для указания этого.
Я пробовал наивный подход ниже, но он не работает.
Button b = new Button();
b.Content = "TwonLines";
или
b.Content = "TwornLines";
в любом случае, все, что я вижу, это первая строка ("два") из текста.
9 ответов:
Я предпочитаю так:
<Button Width="100"> <TextBlock TextWrapping="Wrap">This is a fairly long button label</TextBlock> </Button>
это сработало для меня.
ответ очень прост. Просто используйте


чтобы ввести разрыв строки, т. е.:<Button Content="Row 1 Text 
 Row 2 Text"/>
есть несколько способов сделать это с помощью XAML:
- добавить текстовый блок с разрывом строки:
<Button> <TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock> </Button>
- добавить разрыв строки в текст:
этот метод прост, но нет никакого способа, чтобы легко контролировать выравнивание текста:
<Button Content="Line 1 
 Line 2"/>
- добавить текстовый блок и обернуть текст
как только размер кнопок меньше, чем текстовые блоки размер он будет просто разделить содержимое на две строки или более автоматически
<Button> <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock> </Button>
- используйте can StackPanel в вашей кнопке и добавьте каждую строку в виде текста Блок:
<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>
- Я уверен, что существует еще много, список в основном в порядке от большинства до наименее любимых.
вот как мы это делаем здесь это позволяет легко центрировать, а также
<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
запрещает пользователю выбирать текст, даже если он не может его редактировать, я не хочу, чтобы он даже выбирал его (личный вкус).это сделает текстовое поле похожим на метку, но с преимуществом, которое позволяет выравнивать текст по центру.