2013-12-08 34 views
3

我有Win7上的C#2008(Net 2.0)中的系統Windows窗體ListView,它有4列,並且處於詳細模式,帶有小圖標,full選擇,hideselection爲false,showtooltips爲真。在Windows窗體C#中將Listview列的文本對齊到正確而不更改標頭文本對齊

第3列應爲唯一對齊的右列,而不是像其他列一樣。 我已經設置相應的設計器屬性爲textalignment權,這是合乎邏輯的。 但微軟在這裏很讓人失望:Microsoft Visual Studio也將列標題對齊到我不想要的地方! 只有所有元素都應該在第3列中對齊,所有列的標題文本都將保持左對齊。這似乎是不可能的設計師設置。

我在Google搜索了很長時間,發現這個代碼對齊了我的項目,我希望它如何,但項目文本消失並再次出現,突出顯示和選擇不起作用部分ListView消失在部分或整體,文本呈現怪異和不清晰等等。 - ListView停止默認行爲後,我應用下面的代碼。我如何解決這個問題沒有這個麻煩(Ownerdraw下面的代碼設置爲true,我有Fullrowselect,hideselection false和detailsmode)。基本上我只需要第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

而是繪製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); 
}