Как применять разные стили шрифта в одной строке

У меня есть приложение wpf, C#, которое отображает тексты (имя чайника), когда выпадающий список закрыт. В основном он содержится в 1 строке и передается classInstance.TeachersComboBoxText или же Text="{Binding Path=TeachersComboBoxText}", Все отлично, но клиент запрашивает курсив, если учитель помечен как не учитель по умолчанию или учитель средней школы. По сути, мне нужна строка, но к ней применяются разные стили шрифта, в зависимости от моих данных.

<ComboBox Name="instanceTeachersComboBox"
        IsEditable="True"
        IsReadOnly="True"
        ItemsSource="{Binding Path=TeacherList}" DropDownClosed="teachersComboBox_DropDownClosed"
        Text="{Binding Path=TeachersComboBoxText}"
        FontWeight="{Binding Path=IsSelectedFontWeight}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding Path=IsSelected}" 
                        Background="{Binding Path=IsActiveColour}"
                        Content="{Binding Path=Display}" 
                        Foreground="{Binding Path=IsClashColour}" 
                        FontStyle="{Binding Path=EndDateFontStyle}"/>
                <Image Source="/SchoolEdgeTimetable;component/Images/greentick16x16.png" 
                       Margin="5,0,0,0" 
                       Visibility="{Binding Path=IsSpecialitySubjectVisibility}"></Image>
            </StackPanel>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

=== это код ====

if (classInstance.TeacherList.Any(c => c.IsSelected == true && c.IsDefault == false) || instanceCount != defaultCount)
{
    System.Windows.Forms.RichTextBox rtf = new System.Windows.Forms.RichTextBox();
    foreach (var item in data)
    {
        if (!item.IsDefault)
        {
            rtf.SelectionFont = new Font("Arial", 12, System.Drawing.FontStyle.Italic);
            rtf.AppendText(item.Display);
        }          
        text = GT.Join2Strings(text, item.IsDefault? item.Display : rtf.Text, "\n");
    }
}
else
    text = DEFAULT_TEXT;
classInstance.TeachersComboBoxText = text;

Я попытался RTF, потому что кажется, что я не могу применить его в виде простой строки, но код не работает. Есть ли способ решить эту проблему без использования RTF? или если нет, то почему мой код не работает? Кто-нибудь может предложить лучший способ сделать это будет оценено. Спасибо

ОБНОВЛЕНИЕ: Люди предлагают изменить шаблон, который я уже сделал, это прекрасно работает при показе элементов, когда открыт комбинированный список. Один из моих пунктов - КРАСНЫЙ и курсивом, как вы можете видеть, НО То, что я пытаюсь сделать, это изменить отображение свойства combobox TEXT. Я приложил изображение, чтобы лучше понять, что я имею в виду. Спасибо

3 ответа

Это довольно просто, если вы знаете, как использовать <Run> тег элемента управления TextBlock в коде позади. Смотрите ниже код:

//loop through all the teachers
foreach (var teacher in vm.Teachers)
{
    //check if teacher is default
    if (teacher.IsDefault)
        {   
            //add text to "tb" textblock, in italic style
            tb.Inlines.Add(new Run(teacher.Name) { FontStyle = FontStyles.Italic });
        }
    else
        {
            //add text to "tb" textblock
            tb.Inlines.Add(new Run(teacher.Name));
        }
}

Если вы хотите узнать больше о встроенном форматировании, вот отличная запись в блоге. Дайте мне знать, если вам нужна дополнительная помощь по этому вопросу.

Вы могли бы справиться с Loaded событие для CheckBox в ItemTemplate и установить его Content собственность на TextBlock из Inline элементы, например:

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox IsChecked="{Binding Path=IsSelected}" 
                        Background="{Binding Path=IsActiveColour}"
                        Foreground="{Binding Path=IsClashColour}" 
                        FontStyle="{Binding Path=EndDateFontStyle}"
                        Loaded="CheckBox_Loaded">
            </CheckBox>
            <Image Source="/SchoolEdgeTimetable;component/Images/greentick16x16.png" 
                       Margin="5,0,0,0" 
                       Visibility="{Binding Path=IsSpecialitySubjectVisibility}"></Image>
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>

private void CheckBox_Loaded(object sender, RoutedEventArgs e)
{
    CheckBox checkBox = sender as CheckBox;
    dynamic dataObject = checkBox.DataContext;
    string display = dataObject.Display;
    TextBlock textBlock = new TextBlock();
    //split the display string and add Inlines to the TextBlock as suggested by @Naresh Ravlani here...
    checkBox.Content = textBlock;
}

Добавьте источник данных, который меняет ваш шрифт на курсив:

<DataTrigger Binding="{Binding IsDefault}" Value="1">
    <Setter Property="FontStyle" Value="Italic"/>
</DataTrigger>
Другие вопросы по тегам