Texto Multilínea en un botón WPF


¿Cómo obtengo texto multilínea en un botón WPF usando solo C#? He visto ejemplos de usar <LineBreak/> en XAML, pero mis botones se crean completamente mediante programación en C#. El número y las etiquetas de los botones corresponden a valores en el modelo de dominio, por lo que no creo que pueda usar XAML para especificar esto.

He intentado el enfoque ingenuo a continuación, pero no funciona.

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

O

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

En cualquier caso, todo lo que veo es la primera línea ("Dos") del texto.

Author: Cœur, 2009-09-19

9 answers

O en XAML directamente:

<Button>
   <TextBlock>Two<LineBreak/>Lines</TextBlock>  
</Button>
 83
Author: Sergey Malyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-09 01:08:03

Prefiero esto:

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

Funcionó para mí.

 39
Author: MelloG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-19 16:38:10

La respuesta es muy simple. Simplemente use &#xa; para introducir el salto de línea, es decir:

<Button Content="Row 1 Text &#xa; Row 2 Text"/>
 26
Author: Hassan Rahman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-04 06:15:15

Hay varias maneras de hacer esto a través de XAML:

  1. Añadir un bloque de texto con un salto de línea:
<Button>     
    <TextBlock TextAlignment="Center">Line 1<LineBreak/>Line 2</TextBlock>
</Button>
  1. Añadir un salto de línea en el texto:

Este método es simple pero no hay manera de controlar fácilmente la alineación del texto:

    <Button Content="Line 1 &#xa; Line 2"/>
  1. Agregue un bloque de texto y Envuelva el texto

Una vez que el tamaño de los botones es más pequeño que el tamaño de los bloques de texto, simplemente dividirá el contenido en dos líneas o más automáticamente

<Button>
  <TextBlock TextWrapping="Wrap" HorizontalAlignment="Center">Line 1 Line 2</TextBlock>
</Button>
  1. Use can un StackPanel en su Botón, y agregue cada línea como un texto Bloque:
<Button>
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
  1. Usa una Cuadrícula en tu Botón:
<Button>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
            <TextBlock Text="Line1" HorizontalAlignment="Center"/>
            <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </Grid>
</Button>
  • Estoy seguro de que existen muchos más, la lista está básicamente en orden de más a menos favorito.
 15
Author: Merav Kochavi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-19 07:55:07

Así es como lo hacemos aquí también permite un centrado fácil

<Button Height="40" Width="75">
    <StackPanel>
        <TextBlock Text="Line1" HorizontalAlignment="Center"/>
        <TextBlock Text="Line2" HorizontalAlignment="Center"/>
    </StackPanel>
</Button>
 11
Author: Dennis O J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-10 15:20:46

Resulta que "\n" funciona bien. Mi cuadrícula tenía un tamaño fijo, y simplemente no hay una indicación visual en un botón de que hay más texto disponible (por ejemplo, no "..."indicando un corte). Una vez que generosamente expandí el tamaño de mi cuadrícula, el texto del botón apareció en dos filas.

 8
Author: Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-10 13:58:10

¿has probado esto?

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

Si eso no funciona, entonces podría intentar agregar un StackPanel como hijo y agregar dos elementos TextBlock a eso.

 5
Author: Drew Noakes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-19 19:24:23

Qué tal:

TextBlock textBlock = new TextBlock();
textBlock.Inlines.Add("Two");
textBlock.Inlines.Add(new LineBreak());
textBlock.Inlines.Add("Lines");
Button button = new Button();
button.Content = textBlock;

Si estás usando C# 3 puedes hacerlo un poco más limpio:

Button button = new Button
{
    Content = new TextBlock { Inlines = { "Two", new LineBreak(), "Lines" } }
};
 4
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-19 19:33:13

Tuve el mismo problema.

Lo intenté:
- botón.content = "Line1\nLine2" (no funcionó, tal vez hice algo mal);
- reemplazar el texto del botón con una nueva etiqueta (no le permite centrar alinear el texto);
- reemplazar el texto del botón con un bloque de texto (creo que esto le permite centrar alinear el texto, pero no lo envuelve);

He visto respuestas que mencionan el uso de paneles apilados o cuadrículas.
He visto respuestas que dicen no usar un cuadro de texto .

Aunque la OP dice que el \n funciona, no creo que ese sea el camino a seguir, en mi opinión solo estás forzando brutalmente al control a hacer lo que quieras y si en algún momento necesitas cambiar el texto tendrás que ir y comprobar si el texto está correctamente envuelto o si el \n necesita estar en otra posición.
Lo que encontré para ser la mejor manera de ir (para mí) es reemplazar el contenido del botón con un cuadro de texto (solo puede arrastrar y soltar, sin necesidad de meterse con XAML) y establecer las siguientes propiedades como declarado: IsReadOnly = true;
Focusable = false (opcional);
Creo que Focusable = false impide que el usuario seleccione el texto, aunque no pueda editarlo, no quiero que lo seleccione (gusto personal).

Esto hará que el cuadro de texto se comporte de manera similar a una etiqueta, pero con la ventaja de que le permite alinear el texto en el centro.

 0
Author: Rui Santos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-07 17:32:43