2014-01-21 3 views
0

Может кто-нибудь, пожалуйста, дайте мне знать, как я мог бы сделать текст конвертера с переменным размером шрифта, чтобы связанный текстовый блок мог отображать его? Если это невозможно с помощью TextBlock, я могу использовать и альтернативный элемент.Как сделать текст возврата IValueConverter с различными шрифтами, надстрочными индексами и/или индексами

Вот код, который я прямо сейчас, это, очевидно, не работает

В моем XAML файл:

<TextBlock Text="{Binding Converter={StaticResource LabelFormatConerter}}"/> 

В моем XAML.cs файл:

public class LabelFormatConerter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     TextBlock tb = new TextBlock(); 
     Run runLargeFont = new Run(); 
     runLargeFont.FontSize = 18; 
     runLargeFont.Text = "Larger Font Text"; 
     tb.Inlines.Add(runBase); 

     Run runSmallFont = new Run(); 
     runSmallFont.FontSize = 8; 
     runSmallFont.BaselineAlignment = BaselineAlignment.Superscript; 
     runSmallFont.Text = "Smaller Font Text"; 
     tb.Inlines.Add(runSmallFont); 

     return tb.Text; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

Как вы фактически конвертируете 'значение' с этим конвертером? –

ответ

1

Это должно работать для вас:

<TextBlock FontFamily="Calibri"> 
     <Run>Normal Text</Run> 
     <Run Typography.Variants="Superscript">Test</Run> 
     <Run Typography.Variants="Subscript">7</Run> 
</TextBlock> 

Не все шрифты поддерживают супер \ индексы, поэтому я должен был указать это явно.

Что вы будете делать? Два/три отдельных значения или одно значение, которое нужно разбить на нормальное значение, надстрочный индекс и индекс?

+0

Спасибо за ответ. Ваш ответ в сочетании с Виктором Гурдугачи получил то, что я искал. Мой ввод был только одним значением, которое нужно было разделить на надстрочный и обычный текст, как в 10ⁿ. – user1869870

1

Это можно сделать с помощью TextBlock, но я не знаю, как это сделать. Ваш конвертер возвращает коллекцию объектов Run, а свойство Text ожидает строку.

Альтернативой является пользователем элемент управления пунктов:

<ItemsControl ItemsSource="{Binding Converter={StaticResource LabelFormatConerter}}" /> 

и вернуть

tb.Inlines 

от вашего преобразователя. (в идеале вы просто создаете только коллекцию внутри конвертера, а не новый TextBlock)

+0

Спасибо за ответ. Ваш ответ в сочетании с @ Fayilt получил то, что я искал. Мой ввод был только одним значением, которое нужно было разделить на надстрочный и обычный текст, как в 10ⁿ. – user1869870

1

Конвертер - это не тот инструмент, который подходит для этого задания - вот что такое ContentTemplate. Просто используйте ContentControl, привязки данных к Content собственности и отображать данные, однако ваше хотение в вашем ContentTemplate:

<ContentControl Content="{Binding Person}"> 
    <ContentControl.ContentTemplate> 
     <DataTemplate> 
      <TextBlock> 
       <Run FontSize="18" Text="{Binding FirstName}" /> 
       <Run FontSize="8" Text="{Binding LastName}" /> 
      </TextBlock> 
     </DataTemplate> 
    </ContentControl.ContentTemplate> 
</ContentControl> 
Смежные вопросы