2009-09-09 8 views
9

Je cherche quelque chose le long de ces lignes:Comment insérer une liaison au milieu d'une phrase d'un TextBlock dans WPF?

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

Ce sera bien sûr afficher réellement le texte « {} Reliure UserName » à l'utilisateur plutôt que de le décoder, mais je sais que vous pouvez faire quelque chose comme ça avec ASP.NET, donc j'espère qu'il y a un moyen de faire fonctionner cela dans WPF.

Je suis déjà au courant que je pourrais utiliser un IValueConverter ... Je cherche quelque chose que je peux faire purement en balisage si possible.

EDIT:

Basé sur la solution la plus excellente de Hamilton @ Matt, j'ai essayé de pousser l'enveloppe et de lier deux valeurs dans le même TextBlock en utilisant un MultiBinding. Fonctionne comme un charme:

<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> 

Ce produit: Attempts: 1 of 4 (en supposant AttemptNumber = 1 et AttemptCount = 4).

J'ai aussi trouvé ce lien utile pour déterminer quels formats pour placer après les deux points:

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

Répondre

15

Vous pouvez utiliser la propriété de liaison StringFormat dans .NET 3.5 SP1:

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

Notez que vous devez échapper aux accolades dans le format de chaîne avec une barre oblique inverse.

Mise à jour Oui, plusieurs valeurs sont également pris en charge:

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

Whee, c'est bien. L'ordre est bizarre, cependant, car c'est exactement le contraire de l'habituel [string] :: Format. – Joey

+0

Magnifique! Cela m'amène à une autre question, cependant: est-il possible d'avoir plusieurs valeurs liées ou êtes-vous limité à un? Merci. – devuxer

+0

Répondu à ma propre question (voir ma vérification). – devuxer

0

Jusqu'à présent, je ne sais pas d'une solution qui rend possible exactement de la même manière que vous le décrivez. Cependant, vous pouvez, en tant que solution de contournement, utiliser plusieurs blocs de texte à rassembler votre phrase:

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

C'est ce que je jusqu'à présent et tout difficiles à taper, il semble être la solution la plus simple. Mais dès que vous avez besoin d'internationalisation, c'est un non-sens pour des raisons évidentes.

+0

Je l'ai utilisé un 'StackPanel' à chaîne paires de valeur de l'attribut ensemble avant (par exemple, « Statut: succès »), mais je suis un peu méfiant à l'utiliser pour cordes différentes parties ensemble d'une phrase parce que Je pensais que l'espacement de texte naturel pourrait ne pas être préservé (c'est-à-dire que vous auriez des ruptures plus importantes entre 'TextBlocks' qu'entre des mots du même 'TextBlock'.) Si cela ne pose pas de problème, c'est une bonne solution – devuxer

+0

Jusqu'à présent, je n'ai pas remarqué d'espace supplémentaire, mais le crénage ne fonctionnera probablement pas comme le ferraillent les ligatures automatiques, etc ... Essentiellement, vous découpez le texte en plusieurs passages et je doute que la typographie avancée fonctionne. Je suis assez sérieux et j'évite de concaténer des chaînes et des variables ou d'utiliser des chaînes de format non positionnelles autant que possible. Parfois, une solution rapide et sale comme celle-ci survit, cependant :-) – Joey

0

Jetez un oeil à cette bibliothèque "WPFix". Il permet à l'utilisateur d'écrire des expressions lambda dans le XAML. Je ne l'ai pas utilisé dans le code de production, seulement dans le code de démonstration. J'ai été capable de prendre la largeur d'un formulaire, de le diviser par deux, et de lier la valeur à un contrôle. Habituellement, vous devez créer une classe de conversion, comme vous le décrivez. Cette bibliothèque peut être la chose que vous recherchez:

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

1

Ceci est moyen le plus simple de mélanger du texte et contrôle

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

vous pouvez inline boutons de style et d'autres commandes.

1

La meilleure façon de le faire est d'utiliser les Runs ...

<TextBlock> 
    <Run Text="Welcome"/> 
    <Run Text="{Binding UserName}"/> 
    <Run Text="!"/> 
</TextBlock> 
Questions connexes