2008-09-12 6 views
97

Visualmente, los dos fragmentos siguientes producen la misma IU. Así que ¿por qué hay 2 controles ..
Snippet1¿Cuál es la diferencia entre el elemento WPF TextBlock y el control Label?

<TextBlock>Name:</TextBlock> 
<TextBox Name="nameTextBox" /> 

Snippet2

<Label>Name:</Label> 
<TextBox Name="nameTextBox" /> 

(Bueno, yo estoy va a responder por mí mismo ... Pensamos que este es un dato útil que aprendí hoy de Programming WPF)

+3

@Rachel ¿Por qué esta pregunta está marcada como un duplicado de una que fue escrita 3 años después _ (especialmente dado que ésta tiene más votos positivos y mejores respuestas) _? –

Respuesta

108

El FPM Textblock hereda de FrameworkElement en lugar de derivados de System.Windows.Control como el control de etiqueta. Esto significa que el Textblock es mucho más ligero. La desventaja de utilizar un bloque de texto no es compatible con las teclas Acceso/Accerelator y no hay un enlace a otros controles como destino.

Cuando se desea mostrar texto por sí mismo usar el TextBlock. El beneficio es una forma ligera y efectiva de mostrar texto.

cuando se quiere asociar el texto con otro control como un cuadro de texto usar el control Label. Los beneficios son claves de acceso y referencias al control objetivo.

+13

@Kugel: No veo ninguna referencia a 'Label' en la página vinculada, por lo que no veo cómo justifica que' TextBlock' sea más lento que una 'Label'. ¿Puedes por favor elaborar? Si una 'Etiqueta' usa un' TextBlock' para renderizar, como sugiere http://joshsmithonwpf.wordpress.com/2007/07/04/differences-between-label-and-textblock/, ¿qué hace que un 'TextBlock' sea más lento? – Mashmagar

19

etiqueta tiene un importante gestión de enfoque responsabilidad. Su propósito es permitirle colocar un título con una clave de acceso. Tiene una propiedad Target, que indica el destino de la clave de acceso. De esta manera ...

<Label Target="{Binding ElementName=nameTextBox}">_Name:</Label> 
<TextBox x:Name="nameTextBox" /> 

En ausencia de la propiedad Target, el control Label no sirve de nada. Usted sólo oye un pitido al pulsar la tecla de acceso que indica 'pudo procesar la solicitud'

+0

¿Hay alguna forma de obtener la etiqueta dirigida a TextBox con TextBox? –

+0

@ArsenMkrt - ¿te refieres a un Textbox que contiene otro TextBox? Si tiene un elementName único, debería funcionar. – Gishu

+0

No @Gishu, quiero decir, ¿es la única forma de encontrar etiquetas dirigidas a TextBox en su ejemplo anterior, para enumerar el árbol visual? –

-8

La etiqueta se puede utilizar como una alternativa a TextBlock para situaciones en las que se requiere una compatibilidad de texto mínima, como la etiqueta de un control. Usar Label puede ser ventajoso porque requiere incluso menos recursos (peso más ligero) que un TextBlock.

+7

Esto es incorrecto. TextBlock es el más simple (ligero) entre los dos. Se deriva de FrameworkElement .. Consulte la respuesta mejor calificada. – Gishu

2

Con TextBlock podemos tener soporte para varias líneas, supongo, usando TextWrapping.

Usando Label en tales casos, p. mostrando el mensaje de validación, necesita usar las etiquetas <AccessKey>, que es menos directo que TextBlock.

Por otro lado, el uso de TextBlock no nos permite establecer la propiedad BorderBrush.

Por lo tanto, para mí, los dos controles se deben combinar en un control de texto con todas las funciones.

+0

Excepto que TextBlock no es un control, por lo que hay una razón bastante importante para no combinarlos. – Joey

3

Las dos principales razones de la confusión con respecto a TextBlocks y etiquetas son las formas de Windows y el sentido común.

  1. Cuando se quería dar una palmada a un pequeño fragmento de texto en su forma en las formas de Windows, que utilice una etiqueta, por lo que sigue (incorrectamente) que usted haría lo mismo con una etiqueta de WPF.

  2. El sentido común lo llevaría a creer que una etiqueta es liviana y un bloque de texto no lo es, cuando ocurre lo contrario.

Tenga en cuenta que puede poner un TextBlock dentro de una etiqueta.

2

La etiqueta toma todo tipo de entradas de datos como String, Number etc ... TextBlock, como su nombre indica, solo acepta una cadena de texto.

Cuestiones relacionadas