如何在 .NET ListView 中设置标题排序字形?

Ian*_*oyd 4 sorting listview themes header glyph

如何在 .NET 2.0 WinForms ListView 中设置具有标题排序标志符号的列及其方向?

.net 的 listview 不是托管控件,它是 Win32 ListView 公共控件的一个非常薄的包装。它甚至不是一个非常好的包装器 - 它没有公开真正列表视图的所有功能。

Win32 listview通用控件支持使用主题绘制自身。主题元素之一是标题排序箭头。Windows 资源管理器的列表视图公共控件知道如何使用该主题元素绘制其列之一。

  • Win32列表视图是否支持指定哪一列具有什么排序顺序?
  • 列表视图内部使用的Win32标头控制是否支持指定哪一列具有什么排序顺序?
  • win32标头控件是否支持自定义绘图,因此我可以自己绘制标头排序字形?
  • win32 listview控件是否支持自定义标题绘制,因此我可以自己绘制标题排序字形?
  • .NET ListView 控件是否支持自定义标题绘制,因此我可以自己绘制标题排序字形?

小智 5

如果有人需要快速解决方案(它在列标题文本的开头绘制向上/向下箭头):

\n\n

ListViewExtensions.cs:

\n\n
public static class ListViewExtensions\n{\n    public static void DrawSortArrow(this ListView listView, SortOrder sortOrder, int colIndex)\n    {\n        string upArrow = "\xe2\x96\xb2   ";\n        string downArrow = "\xe2\x96\xbc   ";\n\n        foreach (ColumnHeader ch in listView.Columns)\n        {\n            if (ch.Text.Contains(upArrow))\n                ch.Text = ch.Text.Replace(upArrow, string.Empty);\n            else if (ch.Text.Contains(downArrow))\n                ch.Text = ch.Text.Replace(downArrow, string.Empty);\n        }\n\n        if (sortOrder == SortOrder.Ascending)\n            listView.Columns[colIndex].Text = listView.Columns[colIndex].Text.Insert(0, downArrow);\n        else\n            listView.Columns[colIndex].Text = listView.Columns[colIndex].Text.Insert(0, upArrow);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

用法:

\n\n
private void lstOffers_ColumnClick(object sender, ColumnClickEventArgs e)\n{\n    lstOffers.DrawSortArrow(SortOrder.Descending, e.Column);\n}\n
Run Code Online (Sandbox Code Playgroud)\n