将Windows窗体C#中的Listview列的文本对齐,而不更改标题文本对齐方式

时间:2013-12-08 02:34:09

标签: c# winforms listview alignment subitem

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

第3列应作为唯一的列与右侧对齐,而不是与其他列对齐。 我已将相应的designer-property设置为textalignment right,这是合乎逻辑的。 但微软在这里几乎没有让人失望:微软Visual Studio也将列标题与我不想要的权利排列在一起! 只有所有元素都应在第3列中对齐,所有列的标题文本都将保持对齐。这似乎是设计师设置无法实现的。

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

 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;
    }

1 个答案:

答案 0 :(得分:1)

在自行绘制所有项目时,不是将ColumnHeader绘制为默认值,为什么不将所有项目作为默认值绘制并自己绘制ColumnHeader?我试过这段代码,但鼠标结束时ColumnHeader的外观和感觉不好,它不像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);
}