【问题标题】:How to create a flat columnheader button in listview (Windows Forms C#)如何在列表视图中创建平面列标题按钮(Windows 窗体 C#)
【发布时间】:2011-10-23 19:41:51
【问题描述】:

如何在 C# 中为列表视图的列标题创建一个“FlatStyle”按钮? 我对此进行了一些研究,并发现了这段 VB 代码: http://www.freevbcode.com/ShowCode.asp?ID=426

我不确定如何在 C# 中做到这一点,我也想知道是否有更好的方法来做到这一点。

谢谢!

【问题讨论】:

    标签: c# windows forms listview columnheader


    【解决方案1】:

    该代码可以追溯到 Vista 之前,并且不再适用于标题控件的新 Vista 视觉样式。您还需要关闭视觉样式渲染。它也不能在当今常见的 64 位模式下工作。另一个副作用是用户在悬停列标题时不再获得视觉反馈,这是关闭 HDS_BUTTON 样式标志不可避免的副作用。

    Anyhoo,这是使标题看起来扁平的代码。向您的项目添加一个新类并粘贴如下所示的代码。编译。将新控件从工具箱顶部拖放到表单上。

    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    class FlatListView : ListView {
        public FlatListView() {
            this.HeaderStyle = ColumnHeaderStyle.Nonclickable;
        }
        protected override void OnHandleCreated(EventArgs e) {
            if (this.View == View.Details) {
                IntPtr hHeader = SendMessage(this.Handle, LVM_GETHEADER, IntPtr.Zero, IntPtr.Zero);
                SetWindowTheme(hHeader, "", "");
            }
            base.OnHandleCreated(e);
        }
    
        private const int LVM_GETHEADER = 0x1000 + 31;
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
        [DllImport("uxtheme.dll")]
        private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);
    }
    

    【讨论】:

      【解决方案2】:

      但是,我不立即知道如何在 Windows 窗体中执行此操作, 如果您的代码允许,您可以尝试创建 WPF 应用程序而不是 Windows 窗体。它背后的代码仍然是 C#,但它允许更多增强的图形更改。

      Windows 窗体有时会阻止某些视觉可能性。

      问候, 凯文

      【讨论】:

        【解决方案3】:

        您可以这样做,但用户将无法单击标题。

        如果您创建列表视图的列,则当用户显示详细视图时,列标题会出现并且其行为类似于常规按钮。这也意味着用户可以单击列标题并且您可以采取行动。 如果您不希望这种外观和行为,您可以使列显示为扁平。此特性由 ListView 类的 HeaderStyle 属性控制。此属性基于 ColumnHeaderStyle 枚举器。其成员是:

        可点击:这是默认样式。列标题的出现和行为类似于按钮:

        listView1.HeaderStyle = ColumnHeaderStyle.Clickable;
        

        不可点击:列是扁平的,当用户单击时不会改变其外观:

        listView1.HeaderStyle = ColumnHeaderStyle.Nonclickable;
        

        【讨论】:

        • 不适用于 Vista 和 Windows 7,它们呈现标题的方式不同,看起来不再平坦。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多