2009-09-09 15 views
9

Sto cercando qualcosa in queste righe:Come si inserisce una rilegatura nel mezzo di una frase di un TextBlock in WPF?

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

Ovviamente questo in realtà visualizzare il testo "{Binding username}" per l'utente, piuttosto che decodificarlo, ma so che si può fare qualcosa di simile con ASP.NET, quindi spero che ci sia un modo per farlo funzionare in WPF.

Sono già consapevole che potrei usare uno IValueConverter ... Sto cercando qualcosa che posso fare puramente nel markup se possibile.

EDIT:

Sulla base di più eccellente soluzione @ Matt Hamilton, ho cercato di spingere la busta e si legano due valori nella stessa TextBlock utilizzando un MultiBinding. Funziona come un fascino:

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

Questo produce: Attempts: 1 of 4 (supponendo AttemptNumber = 1 e AttemptCount = 4).

Ho trovato anche questo link utile per capire quali formati di inserire dopo i due punti:

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

risposta

15

È possibile utilizzare la proprietà di legame StringFormat in .NET 3.5 SP1:

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

Si noti che è necessario per sfuggire alla parentesi graffe in formato stringa con un backslash.

aggiornamento Sì, sono supportati anche valori multipli:

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

Whee, è carino. L'ordinamento è strano, tuttavia, poiché è esattamente il contrario con il solito [string] :: Format. – Joey

+0

Bello! Questo mi porta ad un'altra domanda, però: è possibile avere più valori associati o sei limitato a uno? Grazie. – devuxer

+0

Ho risposto alla mia domanda (vedi la mia modifica). – devuxer

0

Finora non so di una soluzione che rende possibile tutto questo esattamente nello stesso modo in cui lo descrivi. Tuttavia, è possibile, come soluzione alternativa, utilizzare più blocchi di testo di mettere insieme la tua frase:

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

Questo è quello che ho usato finora e mentre ingombrante di digitare sembra essere la soluzione più semplice. Ma non appena hai bisogno di internazionalizzazione è un no-go per ovvi motivi.

+0

ho usato un 'StackPanel' di stringa insieme attributo-valore coppie prima (ad esempio, "Stato: Successful"), ma ero un po 'diffidente di usarlo per stringa insieme diverse parti di una frase perché Ho pensato che la spaziatura naturale del testo potrebbe non essere preservata (cioè, avresti più grandi pause tra 'TextBlocks' che tra parole dello stesso' TextBlock'. Se questo risulta non essere un problema, però, questa è una buona soluzione – devuxer

+0

Fino ad ora non ho notato spazi extra, ma il kerning molto probabilmente non funzionerà come legature automatiche, ecc. Essenzialmente si interromperà il testo in diverse esecuzioni e dubito che la tipografia avanzata funzioni su quelle, ma per alcuni progetti la parte i18n è una cosa abbastanza seria ed evito di concatenare stringhe e variabili o di usare stringhe di formato non posizionali ove possibile. A volte sopravvive una soluzione rapida e sporca come questa :-) – Joey

0

Date un'occhiata a questa biblioteca "WPFix". Permette all'utente di scrivere espressioni lambda nello XAML. Non l'ho usato nel codice di produzione, solo nel codice demo. Sono stato in grado di prendere la larghezza di un modulo, dividerlo per due e associare il valore a un controllo. In genere, è necessario creare una classe di convertitore, come descritto. Questa libreria può essere la cosa che stai cercando:

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

1

Questo è modo più semplice per mescolare testo e controlla

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

è possibile inline in stile pulsanti o altri controlli a.

1

Il modo migliore per farlo è utilizzare le corse ...

<TextBlock> 
    <Run Text="Welcome"/> 
    <Run Text="{Binding UserName}"/> 
    <Run Text="!"/> 
</TextBlock> 
Problemi correlati