WPF按钮中的多行文本

74

我如何在WPF按钮上仅使用C#实现多行文本?我看到过在XAML中使用<LineBreak/>的示例,但我的按钮完全是通过C#编程创建的。按钮上的数字和标签与域模型中的值对应,因此我不认为可以使用XAML来指定它们。

我尝试了下面这种朴素的方法,但它不起作用。

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

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


原来问题可能与按钮在网格中有关。当我随意创建一个按钮时,"\n"可以正常工作。但是,我有一个按钮网格,每个按钮占用一个单元格。该网格位于DockPanel的左侧。在这种情况下,"\n"无法正常工作,我只能看到文本的第一行。(很抱歉最初的问题有误导性) - Paul Gestwicki
4
抱歉大家,我因为非常兴奋加入stackoverflow并发布我的第一个问题,所以我的第一个问题很糟糕。 "\n" 可以正常工作。我的网格大小是固定的,在按钮中没有任何视觉指示表明有更多的文本可用(例如没有省略号表示截断)。一旦我慷慨地扩展了我的网格大小,按钮文本就正常显示了。 :P - Paul Gestwicki
11个回答

114

或者在XAML中直接使用:

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

1
谢谢,我一直在看TextBox,但是TextBlock+LineBreak才是我需要的。 - juFo
我喜欢这个,因为你可以明确地在想要的位置中断。 - DRapp

59

我更喜欢这种方式:

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

对我有效。


2
有没有办法使用这个解决方案使文本居中? - Jeff
12
我在这里找到答案:https://dev59.com/WW445IYBdhLWcg3w7unD#4624689。即--使用TextAlignment而不是HorizontalAlignment。 - Jeff
那个方法可行,但与在XAML中使用“ ”或在代码后台中使用“\n”不同的是,当按钮被禁用时,文本保持为黑色。默认情况下,禁用的按钮文本会变灰。 - Vad

53
答案很简单。只需使用&#xa;来引入换行符,例如:
<Button Content="Row 1 Text &#xa; Row 2 Text"/>

如果我想做一个类似于键盘的按钮,如何在7上实现?目前它显示为无效标记,因为“预期以下标记';'”..还有带有多行下划线。 - Luiey
2
@Luiey 你可以使用这个 <Button Content="& 7"/>。 - Hassan Rahman
1
完美!而对于下划线与减号,我使用<Button Content="__&#xa;-"/>双下划线。 - Luiey

32

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

  1. 添加一个带有换行的TextBlock:

<Button>     
    <TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock>
</Button>
  • 在文本中添加换行:
  • 这种方法很简单,但没有办法轻松控制文本的对齐方式:

        <Button Content="Line 1 &#xa; Line 2"/>
    
  • 添加文本块并换行文本
  • 一旦按钮大小小于文本块大小,它将自动将内容拆分为两行或更多行。

    <Button>
      <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
    </Button>
    
    你可以在按钮中使用 StackPanel,并将每行作为 TextBlock 添加进去:
    1. Use can a StackPanel in your Button, and add each line as a Text Block:
    <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>
    
    我相信还有很多,这个列表基本上是按最喜欢到最不喜欢的顺序排列的。

    13

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

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

    你如何以编程方式更改第二行的文本? - Regis St-Gelais
    好的,我是这样做的(这里为了简单起见没有进行错误处理): StackPanel? sp = buttonA3.FindName("stackpanel") as StackPanel; 如果 (sp != null) { ((TextBlock)sp.Children[0]).Text = "文本1"; ((TextBlock)sp.Children[1]).Text = "文本2"; } - Regis St-Gelais

    9
    原来 "\n" 可以正常工作。我的网格大小是固定的,按钮中没有任何视觉提示表明有更多的文本内容可用(例如没有 "..." 表示截断)。一旦我慷慨地扩大了网格的大小,按钮文本就显示在两行中。

    8

    你尝试过这个吗?

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

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

    这个代码可以运行,但我使用了以下代码: Text = "两行\n内容" - jas

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

    0

    我遇到了同样的问题。

    我尝试过:
    - button.content = "Line1\nLine2"(没有起作用,可能是我做错了什么);
    - 用新标签替换按钮文本(无法让文本居中对齐);
    - 用文本块替换按钮文本(我认为这可以让文本居中对齐,但不能自动换行);

    我看到有答案提到使用stackpanels或grids。
    我看到有答案说不要使用Textbox

    尽管OP说\n可以工作,但我认为这不是正确的方法。在我看来,你只是强制控件做你想要的事情,如果你需要更改文本,你将不得不检查文本是否正确换行或\n是否需要放在另一个位置。
    我发现最好的方法(对我来说)是用文本框替换按钮内容(你可以直接拖放,无需操作XAML),并设置以下属性: IsReadOnly = true;
    Focusable = false(可选);
    我认为Focusable = false可以防止用户选择文本,即使他不能编辑它,我也不希望他选择它(个人喜好)。

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


    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>
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接