WPF 按钮中的多行文本

我如何得到一个 WPF 按钮上的多行文本只使用 C # ?我见过在 XAML 中使用 <LineBreak/>的例子,但是我的按钮完全是用 C # 编程创建的。按钮上的数字和标签对应于域模型中的值,所以我不认为我可以使用 XAML 来指定它。

我已经尝试了下面这种天真的方法,但是没有用。

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

或者

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

无论哪种情况,我看到的都是文本的第一行(“ Two”)。

101061 次浏览

你试过这个吗?

b.Content = new TextBlock {
Text = "Two\nLines",
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" } }
};

结果发现“ n”很好用。我的网格有一个固定的大小,而且在按钮中没有任何可见的指示,表示有更多的文本可用(例如,没有“ ...”表示截止)。一旦我慷慨地扩展了网格的大小,按钮文本就会显示在两行中。

或直接使用 XAML:

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

我更喜欢这样:

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

对我很有效。

这就是我们在这里的做法,它允许容易的中心以及

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

答案很简单,只要用 &#xa;引入换行符即可,例如:

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

有几种方法可以通过 XAML 实现这一点:

  1. 添加带有换行符的 TextBlock:
<Button>
<TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock>
</Button>
  1. 在文本中添加换行符:

这种方法很简单,但没有办法容易地控制文本的对齐方式:

    <Button Content="Line 1 &#xa; Line 2"/>
  1. 添加文本块并包装文本

一旦 Buttons 大小小于 TextBlock 大小,它就会自动将内容分成两行或更多行

<Button>
<TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
</Button>
  1. 在按钮中添加 StackPanel,并将每一行添加为 Text 座位:
<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.content = “ Line1 nLine2”(不起作用,可能我做错了什么) ;
- 将按钮文本替换为新标签(不允许将文本居中对齐) ;
- 用文本块替换按钮文本(我认为这可以让文本居中对齐,但不包装它) ;

我已经看到答案提到了堆栈面板或网格的使用。
我见过有人回答说不要用 文本框

尽管 OP 说 \n可以工作,但我不认为这是正确的方法,在我看来,你只是粗暴地强迫控件做你想要的,如果在任何时候你需要改变文本,你将不得不去检查文本是否正确包装或者 \n需要在另一个位置。
我发现(对我来说)最好的方法是用一个文本框替换按钮内容(你可以只是拖放,不需要搞乱 XAML) ,并设置如下所述的属性: IsReadOnly = true;
可聚焦 = 错误(可选) ;
我认为 Focusable = false阻止用户选择文本,即使他不能编辑它,我甚至不希望他选择它(个人口味)。< br >

这将使文本框的行为类似于标签,但具有使文本居中对齐的优势。

尝试以下代码:

<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>

作为一个替代/解决方案,如果你必须使用一个外部的自定义按钮,你不能编辑它的内容容易,你总是可以使用网格和覆盖的功能部分的按钮在你的视觉,如果它可以是静态的。

<Grid>
<TextBlock Foreground="LightGray">Click<LineBreak />Here</TextBlock>
<MyCustomButton BorderBrush="Transparent" IsPressed="{Binding MyBtn.IsPressed, Mode=TwoWay}" />
</Grid>