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

Wpf 如何在一个字符串中应用不同的字体样式,wpf,string,rtf,font-style,Wpf,String,Rtf,Font Style,我有一个wpf应用程序,c#,当组合框关闭时,它会显示文本(teahcer的名字)。基本上,它包含在一个字符串中,并被传递到classInstance.teacherscomboxtext或Text=“{Binding Path=teacherscomboxtext}”。一切都很好,但如果教师被标记为非默认或中级教师,客户端要求文本为斜体。基本上,我需要有一个字符串,但不同的字体样式适用于它,这取决于我的数据 <ComboBox Name="instanceTeachersComboBox

我有一个wpf应用程序,c#,当组合框关闭时,它会显示文本(teahcer的名字)。基本上,它包含在一个字符串中,并被传递到
classInstance.teacherscomboxtext
Text=“{Binding Path=teacherscomboxtext}”
。一切都很好,但如果教师被标记为非默认或中级教师,客户端要求文本为斜体。基本上,我需要有一个字符串,但不同的字体样式适用于它,这取决于我的数据

<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>
我尝试了rtf,因为我似乎无法在纯字符串中应用它,但代码不起作用。有没有办法不用rtf解决这个问题?如果不是,为什么我的代码不起作用?如果有人能提出更好的方法,我们将不胜感激。谢谢

更新: 人们建议修改我已经做过的模板,当一个组合框打开时,它可以很好地显示项目。正如您所看到的,我的一个项目是红色和斜体,但我试图做的是修改combobox文本属性的显示。我附上了一张图片,以便更好地理解我的意思。 谢谢

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

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

如果您知道如何在代码隐藏中使用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));
        }
}

如果你想了解更多关于内联格式的知识,那么这篇博文同样很酷。如果您需要更多帮助,请告诉我。

您可以处理
项目模板中
复选框的
已加载的
事件,并将其
内容
属性设置为
内联
元素的
文本块
,例如:

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

但是老师的名字只被附加在一个字符串中。请看我的密码。因此IsDefault触发器将不再工作。这是一个文本,不是实例或对象。谢谢,我已经看到了一些关于内联的东西,但我不确定我是否可以在组合框中使用它?如果您可以看到,我正在将字符串(所选教师-教师姓名)绑定到组合框的文本属性,而不是textblock。我本来会添加一个带有文本锁的模板,但是如何添加呢?我怎么说该模板仅在组合框关闭且文本将显示时才适用。当它打开时,会在组合框中显示常用项目,如果它关闭,则会显示所有选定教师的显示文本。谢谢,这正是你要做的。您必须使用模板选择器来决定在运行时显示哪个模板。此链接将帮助您做到这一点。请尝试此链接中提供的解决方案,并让我知道您的进度。我已更新了我的问题。如果你有时间看,请随意。thanksI尝试了这个,它在combobox打开时添加了一个内联texblock,而不是在closed期间,所以这不是答案。谢谢。你说的“不在休息时间”是什么意思?这不只是处理另一个事件(例如DropDownClosed事件)的问题吗?创造性思维是开发人员最好的朋友…combobx文本在关闭时显示,而在打开时显示项目。我确实有一个事件调用dropdown closed,即通过连接所有选定项的显示文本来设置文本。无论如何,没关系,我只是建议在每个老师的名字中加一个前缀,因为似乎不可能修改文本模板。感谢所有试图回答的人。
<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;
}