如何使TreeViewItem标头的一部分变为粗体?

时间:2019-02-17 08:54:03

标签: c# wpf treeview

我正在尝试在SQL和wpf中实现简单的搜索功能...我只需要突出显示TextBox中输入的结果中的下一部分。

因此,我在SQL中进行搜索以获取结果并将其放在TreeViewItem上,然后将其添加到TreeView中。一切正常,但是我该如何解决,只将TreeViewItem标头的特定部分加粗?

我已经知道如何找到我想要加粗的文本的位置,但是我只需要使其加粗即可。

TreeViewItem root_item = new TreeViewItem() { Header = "Users" };
FoundUsersTreeView.Items.Add(root_item);
while (sqlReader.Read()) 
{
    TreeViewItem new_item = new TreeViewItem() { Header = sqlReader.GetString(0) };
    root_item.Items.Add(new_item);
}

2 个答案:

答案 0 :(得分:0)

您可以使用HeaderTemplate中的TreeViewItem实现这一目标。从后面的代码添加TreeViewItem时,您可以使用Tag属性来区分需要将哪个设置为 Bold

您可以在DataTemplate下方添加到Resources中。

DataTemplate

<DataTemplate x:Key="headerTemplate">
    <TextBlock Text="{Binding}">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource AncestorType=TreeViewItem, Mode=FindAncestor}}" 
                                 Value="True">
                        <Setter Property="FontWeight" Value="Bold"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
</DataTemplate>

隐藏代码

TreeViewItem root_item = new TreeViewItem() { Header = "Users" };
treeView.Items.Add(root_item);
while (sqlReader.Read()) 
{
    var new_item = new TreeViewItem { Header = sqlReader.GetString(0), Tag = true };
    new_item.HeaderTemplate = Resources["headerTemplate"] as DataTemplate;
    root_item.Items.Add(new_item);
}

您可以将boolean的值设置为Tag属性,以将该 Node 设置为 Bold

答案 1 :(得分:0)

如果要使用wpf进行大量工作,则应使用MVVM。 对于非常简单的内容,直接使用控件是可以的,但难度会很快提高。 您应该改为将数据和模板绑定到控件中。

这就是打算使用WPF的方式。

使用基础数据而不是控件。

如果您看一下此示例:

https://gallery.technet.microsoft.com/WPF-Highlight-Matching-71ad5a04

它与列表视图而不是树视图一起使用,并通过使背景变红来突出显示文本。 不完全是您所需要的。 但是原则是要看的东西。

您可以轻松地将以前的列表视图更改为树形视图。

话虽如此,您似乎只在树状视图中看到项目的级别,因此您无论如何都可以使用列表视图。

随便。

如果您看一下,您会看到每个项目都使用正则表达式拆分,因此每个部件都有单独的RunHi视图模型。 匹配的块在其RunHi上将IsMatch设置为true。 它们被模板化为水平列表视图-因此它看起来像一个文本块,但实际上是一个或多个排列在一起的。 列表视图的每一行本身就是一个列表视图。 如果您特别想要树状视图,当然可以将每个treeviewitem的标题设置为listview。

数据触发器用于使背景变黄。 要使其变为粗体,您只需更改该部分即可:

  <ControlTemplate TargetType="{x:Type ListViewItem}">
      <TextBlock Text="{Binding Text}">
           <TextBlock.Style>
                  <Style TargetType="TextBlock">
                       <Style.Triggers>
                             <DataTrigger Binding="{Binding IsMatch}" Value="True">
                                   <Setter Property="FontWeight" Value="Bold"/>
                              </DataTrigger>
                        </Style.Triggers>
                   </Style>
              </TextBlock.Style>
         </TextBlock>
     </ControlTemplate>