3

我在 Win7 上的 C# 2008 (Net 2.0) 中有一个系统 Windows 窗体 ListView,它有 4 列,处于详细模式,带有小图标,fullrowselection on,hideselection false,showtooltips true。

第 3 列应是唯一与右侧对齐的列,而不是像其他列一样向左对齐。我已将相应的设计器属性设置为 textalignment right 这是合乎逻辑的。但是微软在这里几乎没有让人失望:Microsoft Visual Studio 也将列标题向右对齐,这是我不想要的!只有第 3 列的所有元素都右对齐,所有列的标题文本都保持左对齐。这似乎是不可能的设计器设置。

我在 Google 中搜索了很长时间,发现了这一点 - 代码按照我想要的方式对齐我的项目,但是项目文本消失并再次出现,突出显示和选择部分不起作用 ListView 部分或整体消失,文本呈现奇怪,喜欢不尖锐等等等等 - 在我应用下面的代码后,ListView 停止了默认行为。我怎样才能在没有这些麻烦的情况下解决这个问题(Ownerdraw 将下面的代码设置为 true。我有 Fullrowselect、hideselection false 和 detailsmode)。基本上,我只需要第 3 列中的子项按我的意愿对齐,而无需更改列标题 textalignment,所有其他应为默认绘图 - 我不想更改任何绘图 - 只有对齐应该是我描述的自定义一个以上。

 private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
    {
        TextFormatFlags flags = TextFormatFlags.Left;

        if (e.ColumnIndex == 3)
        {
            flags = TextFormatFlags.Right;
            e.DrawText(flags);
        }
        else
        {
            e.DrawDefault = true;
        }
    }

    private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
    {
        e.DrawDefault = true;
    }
4

1 回答 1

1

与其在ColumnHeader自己绘制所有项目时将其绘制为默认值,不如将所有项目都绘制为默认值并ColumnHeader自己绘制?我已经尝试过这段代码,但是ColumnHeader鼠标悬停时的外观和感觉并不好,它不像 a 的默认外观ColumnHeader,为了让它看起来相似,我相信我们需要更多的代码,但事实并非如此由于我使用的颜色非常相似,因此有很大不同。你可以花更多的时间来定制它。这只是一个演示:

public Form1(){
  InitializeComponent();
  listView1.OwnerDraw = true;
  invalidateHeaders = typeof(ListView).GetMethod("InvalidateColumnHeaders",
                                       System.Reflection.BindingFlags.NonPublic |
                                       System.Reflection.BindingFlags.Instance);
} 

bool hot;
System.Reflection.MethodInfo invalidateHeaders;
//DrawColumnHeader event handler
private void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) {
  if (e.Header.TextAlign == HorizontalAlignment.Right) {
      e.DrawBackground();
      e.DrawText(TextFormatFlags.SingleLine | TextFormatFlags.VerticalCenter);
      if (e.Bounds.Contains(listView1.PointToClient(MousePosition))) {
          bool selected = (e.State & ListViewItemStates.Selected) != 0;
          var solidColor = selected ? Color.FromArgb(30, Color.FromArgb(0, 200, 200)) :
                                      Color.FromArgb(30, Color.Aqua);
          var borderColor = selected ? Color.DarkGray : Color.Aqua;
          e.Graphics.FillRectangle(new SolidBrush(solidColor), e.Bounds);
          var rect = e.Bounds;
          rect.Width -= 2;
          rect.Height -= 2;                    
          ControlPaint.DrawBorder(e.Graphics, rect, 
                       Color.FromArgb(40, borderColor), ButtonBorderStyle.Solid);
          hot = true;
       }
       else hot = false;
   } else {
       e.DrawDefault = true;
       if (hot) {
          invalidateHeaders.Invoke(listView1, null);
          hot = false;
       }
   }
}
//DrawItem event handler
private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) {
   e.DrawDefault = true;
}
//MouseMove event handler
private void listView1_MouseMove(object sender, MouseEventArgs e) {
   invalidateHeaders.Invoke(listView1, null);
}    
于 2013-12-09T03:35:31.873 回答