如何动态更改winforms列表框项的字体?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何动态更改winforms列表框项的字体?相关的知识,希望对你有一定的参考价值。

如何在列表框中为可变数量的项目加粗?我已经看过像this one这样的解决方案,但它似乎只有在运行时我确切知道哪些项应该是粗体才有用。这是我的具体案例:

我有一个列表框,其中包含从文件中读取的字符串列表。我有一个搜索栏,当输入时,会自动将匹配该字符串的项目移动到列表框的顶部。不幸的是,位于顶部并不足以成为“搜索结果”的指标,所以我也想让这些项目变得大胆。在运行之前,我知道我想要变为粗体的所有项目都将位于列表的顶部,但我不知道将会有多少项目。此外,当用户删除搜索栏的内容时,列表将重新排序为其初始顺序,粗体项应不是粗体。

如何在运行时在特定列表框项目之间来回显示粗体/非粗体?

这是我的搜索和显示功能代码:

    private void txtSearch_TextChanged(object sender, EventArgs e)
    {
        string searchTerm = txtSearch.Text.Trim();
        if(searchTerm.Trim() == "") // If the search box is blank, just repopulate the list box with everything
        {
            listBoxAllTags.DataSource = fullTagList;
            return;
        }

        searchedTagList = new List<UmfTag>();
        foreach(UmfTag tag in fullTagList)
        {
            if(tag.ToString().ToLower().Contains(searchTerm.ToLower()))
            {
                searchedTagList.Add(tag);
            }
        }

        // Reorder the list box to put the searched tags on top. To do this, we'll create two lists:
        // one with the searched for tags and one without. Then we'll add the two lists together.
        List<UmfTag> tempList = new List<UmfTag>(searchedTagList);
        tempList.AddRange(fullTagList.Except(searchedTagList));
        listBoxAllTags.DataSource = new List<UmfTag>(tempList);
    }
答案

我能够解决自己的问题。我确实使用了this question中的解决方案,但我改变了它:

    private void listBoxAllTags_DrawItem(object sender, DrawItemEventArgs e)
    {
        e.DrawBackground();
        FontStyle fontStyle = FontStyle.Regular;
        if(e.Index < searchedTagList.Count)
        {
            fontStyle = FontStyle.Bold;
        }
        if(listBoxAllTags.Items.Count > 0) // Without this, I receive errors
        {
            e.Graphics.DrawString(listBoxAllTags.Items[e.Index].ToString(), new Font("Arial", 8, fontStyle), Brushes.Black, e.Bounds);
        }
        e.DrawFocusRectangle();
    }

需要第二个if语句(检查计数是否大于0)。没有它,我收到“index [-1]”错误,因为我的程序首先从空列表框开始,而DrawString方法无法为空listBox.Items []数组绘制字符串。

以上是关于如何动态更改winforms列表框项的字体?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过Powershell代码更改特定WPF列表框项的背景颜色?

所选列表框项的前景色的 Wpf 样式资源

WPF中列表框项的自定义工具提示

动态更改弹出菜单项的字体大小 Android

如何更改 Android 菜单项的自定义字体?

如何动态更改列表中控件的属性(C# Winform)?