71

如何仅使用 C# 在 WPF 按钮上获取多行文本?我已经看到了<LineBreak/>在 XAML 中使用的示例,但是我的按钮完全是在 C# 中以编程方式创建的。按钮上的数字和标签对应于域模型中的值,所以我认为我不能使用 XAML 来指定它。

我尝试了下面的幼稚方法,但它不起作用。

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

或者

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

在任何一种情况下,我看到的都是文本的第一行(“Two”)。

4

11 回答 11

110

或直接在 XAML 中:

<Button>
   <TextBlock>Two<LineBreak/>Lines</TextBlock>  
</Button>
于 2010-04-09T01:08:03.647 回答
59

我更喜欢这种方式:

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

它对我有用。

于 2012-12-19T16:38:10.957 回答
46

答案很简单。只需用于&#xa;引入换行符,即:

<Button Content="Row 1 Text &#xa; Row 2 Text"/>
于 2015-06-26T08:16:29.830 回答
31

通过 XAML 有几种方法可以做到这一点:

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

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

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

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

<Button>
  <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
</Button>
  1. 可以在您的 Button 中使用 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>
  • 我敢肯定还有更多,列表基本上是从最喜欢到最不喜欢的顺序。
于 2015-10-19T07:55:07.673 回答
12

这就是我们在这里的做法,它也可以轻松居中

<Button Height="40" Width="75">
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
于 2014-07-10T15:20:46.963 回答
9

原来“\ n”工作正常。我的网格有一个固定的大小,并且按钮中根本没有视觉指示有更多可用的文本(例如,没有“...”表示截止)。一旦我慷慨地扩大了网格的大小,按钮文本就会显示为两行。

于 2009-09-19T21:31:22.080 回答
8

你试过这个吗?

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

如果这不起作用,那么您可以尝试将 StackPanel 添加为子项并向其中添加两个 TextBlock 元素。

于 2009-09-19T19:24:23.420 回答
4

怎么样:

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" } }
};
于 2009-09-19T19:33:13.777 回答
0

试试下面的代码:

<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>
于 2018-12-04T11:17:49.623 回答
0

作为替代/解决方法,如果您必须使用无法轻松编辑其内容的外部自定义按钮,您始终可以使用网格并将按钮的功能部分覆盖在您的视觉对象上(如果它可以是静态的)。

<Grid>
  <TextBlock Foreground="LightGray">Click<LineBreak />Here</TextBlock>
  <MyCustomButton BorderBrush="Transparent" IsPressed="{Binding MyBtn.IsPressed, Mode=TwoWay}" />
</Grid>
于 2021-01-11T12:56:25.493 回答
0

我遇到过同样的问题。

我试过:
- button.content = "Line1\nLine2" (没用,也许我做错了什么);
- 用新标签替换按钮文本(不会让你居中对齐文本);
- 用文本块替换按钮文本(我认为这可以让你居中对齐文本但不换行);

我已经看到提到使用堆栈面板或网格的答案。
我已经看到答案说不要使用Textbox

尽管 OP 说\n有效,但我不认为那是要走的路,在我看来,你只是蛮力强迫控件做你想做的事,如果在任何时候你需要更改你的文本将不得不去检查文本是否正确包装,或者是否\n需要在另一个位置。
我发现(对我来说)最好的方法是用文本框替换按钮内容(您可以拖放,无需弄乱 XAML)并按说明设置以下属性: IsReadOnly = true ;
可聚焦 = 假(可选);
我认为Focusable = false阻止用户选择文本,即使他无法编辑它,我也不希望他选择它(个人喜好)。

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

于 2017-05-07T17:32:43.273 回答