如何在一个字符串中应用不同的字体样式

时间:2017-06-13 06:19:25

标签: wpf string rtf font-style

我有一个wpf应用程序,c#在组合框关闭时显示文本(teahcer的名字)。基本上它包含在1个字符串中,并传递给classInstance.TeachersComboBoxTextText="{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?或者如果不是为什么我的代码不起作用?任何人建议一个更好的方法来做到这一点将不胜感激。感谢

更新: 人们建议修改我已经做过的模板,这在组合框打开时显示项目非常有用。我的一个项目是RED和斜体,因为你可以看到但是我想要做的是修改组合框TEXT属性的显示。我附上了一张图片,以便更好地了解我的意思。 谢谢 enter image description here

3 个答案:

答案 0 :(得分:0)

如果您知道如何在后面的代码中使用TextBlock控件的<Run>标记,那将非常简单。见下面的代码:

//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));
        }
}

如果您希望了解有关内联格式的更多信息,here是一篇很酷的博客文章。如果您需要更多帮助,请告诉我。

答案 1 :(得分:0)

您可以处理LoadedCheckBox的{​​{1}}事件,并将其ItemTemplate属性设置为ContentTextBlock元素,例如:

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>

答案 2 :(得分:-1)

添加一个将字体更改为斜体的数据触发器:

<DataTrigger Binding="{Binding IsDefault}" Value="1">
    <Setter Property="FontStyle" Value="Italic"/>
</DataTrigger>