2011-08-20 18 views
16

Chciałbym dodać tekst do wyników, który jest związany z blokiem tekstu:Dodawanie tekstu do oprawionego TextBlock

<TextBlock Text="{Binding Title}" Foreground="#FFC8AB14" FontSize="28" /> 

Tekst, który jest pokazany:

" My title " 

Co chcę pokazano:

This is "My title" 
+0

Mam nadzieję, że uczyniłem to jaśniejszym, nie zmieniając tego, co zamierzałeś. –

+0

@Jeff Mercado Cheers, już od jakiegoś czasu. Mam nadzieję, że ten będzie szybkim rozwiązaniem dla kogoś. Musiałbym przez dodanie innego "" zanim {} by zadziałało, ale odpowiedziałem źle. – Rhys

+0

Wszystko ze względu na pytania o wyższej jakości. ;) –

Odpowiedz

33

Można użyć właściwości wiązania StringFormat:

<TextBlock Text="{Binding Title, StringFormat=This is {0}}"></TextBlock> 

Odjazd ten post na blogu, aby uzyskać więcej informacji: WPF String.Format in XAML with the StringFormat attribute.

+0

To wygląda jak najbardziej semantyczna opcja. Dzięki – Rhys

+4

brakuje przecinka?

+1

@GernBlanston Dlaczego po prostu go nie naprawiać zamiast wskazywać w komentarzach? :) Autor otrzyma powiadomienie. Naprawiono to teraz. –

3

Cześć można napisać w następujący sposób:

<TextBlock> 
    <TextBlock>This is </TextBlock> 
    <TextBlock Text="{Binding Title}"></TextBlock> 
</TextBlock> 
2

Można to zrobić z konwerterem.

<TextBlock Text="{Binding Title, ConverterParameter=This is, Converter={StaticResource TextPrefixConverter}}" Foreground="#FFC8AB14" FontSize="28" /> 

Konwerter po prostu przedrostuje związaną wartość za pomocą parametru ConverterParameter.

public class TextPrefixConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    {       
     String result = String.Empty; 
     if (parameter != null) 
      result = parameter.ToString(); 

     if (value != null) 
      result += value.ToString(); 

     return result; 
    } 
... 
} 

Nie jest oczywiste, że spacje i/lub cudzysłowy mają być częścią wyjścia. Jeśli tak, konwerter można zmienić, aby przyciąć spacje i/lub dodać cytaty do skonstruowanego napisu.

Innym sposobem osiągnięcia tego celu jest:

<TextBlock Foreground="#FFC8AB14" FontSize="28" > 
    <Run Text="This is " /> 
    <Run Text="{Binding Path=Title}" />  
</TextBlock> 
6

Jeśli chcesz to zrobić w wiązaniu:

<TextBlock Foreground="#FFC8AB14" FontSize="28"> 
    <TextBlock.Text> 
     <Binding Path="Title"> 
      <Binding.StringFormat> 
       This is "{0}" 
      </Binding.StringFormat> 
     </Binding> 
    </TextBlock.Text> 
</TextBlock> 

Element składni wymagane do ucieczki cytaty. Jeśli cytaty gdzie właśnie z okazji wstawiony tekst i nie powinien pojawić się na wyjściu o wiele łatwiej jest oczywiście:

<TextBlock Text="{Binding Title, StringFormat={}This is {0}}" Foreground="#FFC8AB14" FontSize="28"> 
3

wystarczy użyć StringFormat do celów formatowania.

<TextBlock Text="{Binding Title,StringFormat='This is {0}'}" Foreground="#FFC8AB14" FontSize="28" /> 
0

Najlepszym rozwiązaniem tutaj w kategoriach wydajności, jak już odpowiedział korzysta StringFormat dla Binding i przypisać go do właściwości TextBlockText.

Jednak jeśli wydajność nie jest problemem, a jest korzystne XAML czytelność, innym sposobem jest użycie Run wewnątrz TextBlock:

<TextBlock Foreground="#FFC8AB14" FontSize="28"> 
    This is <Run Text="{Binding Title}" /> 
</TextBlock> 

Również w ten sposób można stosować różne style (kolor tekstu/tła, kursywa/pogrubiona czcionka, rozmiar czcionki itp.) do różnych części twojego TextBlock, czego nie można zrobić z Binding 's StringFormat. A to jest o wiele bardziej wydajne niż posiadanie wielu modeli TextBlock z różnymi stylami tekstu/tła.

Powiązane problemy