2009-09-09 19 views
9

Busco algo en este sentido:¿Cómo se inserta un enlace en el medio de una oración de un TextBlock en WPF?

<TextBlock 
    Grid.Column="1" 
    Text="Welcome, {Binding UserName}!" /> 

Esto, por supuesto, en realidad mostrar el texto "{Binding username}" al usuario en lugar de decodificarlo, pero sé que puede hacer algo como esto con ASP.NET, así que espero que haya una forma de hacer que esto funcione en WPF.

Ya soy consciente de que podría usar un IValueConverter ... Estoy buscando algo que pueda hacer solo en el marcado si es posible.

EDIT:

Basado en más excelente solución de @ Matt Hamilton, I trató de empujar el sobre y se unen dos valores en el mismo TextBlock usando un MultiBinding. Funciona como un encanto:

<TextBlock 
    Style="{StaticResource TextBlock_ValueStyle}" 
    Grid.Column="1"> 
    <TextBlock.Text> 
     <MultiBinding 
      StringFormat="{}Attempts: {0:G} of {1:G}"> 
      <Binding 
       Path="AttemptNumber" /> 
      <Binding 
       Path="AttemptCount" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Esto produce: Attempts: 1 of 4 (suponiendo AttemptNumber = 1 y AttemptCount = 4).

También encontré este enlace útil para averiguar qué formatos para colocar tras los dos puntos:

http://msdn.microsoft.com/en-us/library/fbxft59x.aspx

Respuesta

15

Usted puede utilizar la propiedad de unión StringFormat en .NET 3.5 SP1:

<TextBlock Text="{Binding UserName,StringFormat='Welcome, \{0\}!'}" /> 

en cuenta que necesita para escapar de las llaves en el formato de cadena con una barra invertida.

actualización Sí, también se admiten múltiples valores:

<TextBlock> 
    <TextBlock.Text> 
     <MultiBinding StringFormat="Welcome, {0} {1}!"> 
      <Binding Path="FirstName" /> 
      <Binding Path="LastName" /> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 
+0

Whee, eso es bueno. El orden es extraño, sin embargo, ya que es exactamente lo contrario con el [string] habitual: Formato. – Joey

+0

¡Hermoso! Sin embargo, esto me lleva a otra pregunta: ¿es posible tener múltiples valores encuadernados o está limitado a uno? Gracias. – devuxer

+0

Respondí mi propia pregunta (ver mi edición). – devuxer

0

Hasta ahora no sé de una solución que hace posible esto exactamente de la misma manera que usted lo describe Sin embargo, puede, como una solución, utilice varios bloques de texto de reconstruir su frase:

<StackPanel Orientation="Horizontal"> 
    <TextBlock Text="Welcome, "/> 
    <TextBlock Text="{Binding UserName}"/> 
    <TextBlock Text="!"/> 
</StackPanel> 

Esto es lo que he usado hasta ahora y mientras incómodo escribir parece ser la solución más fácil. Pero tan pronto como necesite Internacionalización es un no-go por razones obvias.

+0

He usado un 'StackPanel' hilvanar atributo-valor pares antes (por ejemplo, "Estado: Successful"), pero yo estaba un poco preocupado de usarlo para hilvanar las diferentes partes de una frase, porque Pensé que el espaciado de texto natural podría no conservarse (es decir, tendríamos pausas más grandes entre 'TextBlocks' que entre las palabras del mismo' TextBlock'. Si esto no es un problema, esta es una buena solución – devuxer

+0

Hasta ahora no he notado ningún espacio extra, pero el kerning probablemente no funcionará como lo harán las ligaduras automáticas, etc. Básicamente, se divide el texto en diferentes ejecuciones y dudo que la tipografía avanzada funcione en ellas. Pero para algunos proyectos, la parte i18n es uno bastante serio y evito concatenar cadenas y variables o usar cadenas de formato no posicionales siempre que sea posible. A veces, una solución rápida y sucia como esta sobrevive, aunque :-) – Joey

0

Tenga una mirada en esta biblioteca "WPFix". Le permite al usuario escribir expresiones lambda en el XAML. No lo usé en el código de producción, solo en el código de demostración. Pude tomar el ancho de un formulario, dividirlo por dos y vincular el valor a un control. Por lo general, necesitarías crear una clase de convertidor, como describes. Esta biblioteca puede ser lo que buscas:

http://www.fikrimvar.net/lestirelim/?p=15

1

Ésta es forma más sencilla de mezclar texto y controla

<TextBlock>Welcome, <TextBlock Text="{Binding UserName}"/>!</TextBlock> 

puede inline estilo botones u otros controles a.

1

La mejor manera de hacerlo es usando las ejecuciones ...

<TextBlock> 
    <Run Text="Welcome"/> 
    <Run Text="{Binding UserName}"/> 
    <Run Text="!"/> 
</TextBlock> 
Cuestiones relacionadas