1 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
所有者繪制 ListView 控件比 ListBox 控件更復(fù)雜:需要處理更多細(xì)節(jié)。這是一個(gè)考慮ListView 的四個(gè)視圖設(shè)置的示例:View.Details
、View.List
和。View.Tile
View.SmallIcon
此處僅繪制文本(這View.LargeIcon
就是不包括在內(nèi)的原因),以將代碼包含在合適的范圍內(nèi)。此處
是繪制鏈接到 ListView 的 ImageList 中包含的位圖的示例。
設(shè)置 ListView:
啟用您的 ListViewOwnerDraw
模式,然后訂閱它的DrawItem、DrawSubItem和DrawColumnHeader事件,如示例代碼所示(強(qiáng)制,如果您希望 ListView 顯示任何內(nèi)容)。
使用默認(rèn)渲染(設(shè)置e.DrawDefault = true
)繪制標(biāo)題。
常用操作說(shuō)明:
使用TextRenderer.DrawText繪制 Item Text :這是 ListView 用于繪制其項(xiàng)目的原始方法。它允許完全匹配默認(rèn)呈現(xiàn),因此我們不會(huì)注意到文本的一些未對(duì)齊。
該DrawItem
事件用于在所有模式下繪制自定義背景,并將在除View.DetailsView
之外的所有模式下繪制項(xiàng)目的文本,事件開始發(fā)揮作用:如果事件執(zhí)行相同的任務(wù),我們將繪制第一個(gè)項(xiàng)目的文本兩次.DrawSubItems
DrawItem
當(dāng)設(shè)置為或時(shí),不會(huì)調(diào)用該DrawSubItems
事件。View
Tile
List
此處提供的代碼的詳細(xì)信息:
輔助方法GetTextAlignment
負(fù)責(zé)設(shè)置項(xiàng)目的對(duì)齊方式,因?yàn)槊總€(gè)列都可以具有特定的文本對(duì)齊方式。
字段Color listViewSelectionColor
用于設(shè)置/更改所選項(xiàng)目的顏色。要修改選擇顏色,請(qǐng)將此字段設(shè)置為任何值,Invalidate()
然后 ListView: 將立即應(yīng)用新顏色。
結(jié)果樣本:
https://i.stack.imgur.com/NTpWn.gif
bool lvEditMode = false;
Color listViewSelectionColor = Color.Orange;
protected void listView1_DrawItem(object sender, DrawListViewItemEventArgs e)
{
var lView = sender as ListView;
if (lvEditMode || lView.View == View.Details) return;
TextFormatFlags flags = GetTextAlignment(lView, 0);
Color itemColor = e.Item.ForeColor;
if (e.Item.Selected) {
using (var bkBrush = new SolidBrush(listViewSelectionColor)) {
e.Graphics.FillRectangle(bkBrush, e.Bounds);
}
itemColor = e.Item.BackColor;
}
else {
e.DrawBackground();
}
TextRenderer.DrawText(e.Graphics, e.Item.Text, e.Item.Font, e.Bounds, itemColor, flags);
if (lView.View == View.Tile && e.Item.SubItems.Count > 1) {
var subItem = e.Item.SubItems[1];
flags = GetTextAlignment(lView, 1);
TextRenderer.DrawText(e.Graphics, subItem.Text, subItem.Font, e.Bounds, SystemColors.GrayText, flags);
}
}
private void listView1_DrawSubItem(object sender, DrawListViewSubItemEventArgs e)
{
var lView = sender as ListView;
TextFormatFlags flags = GetTextAlignment(lView, e.ColumnIndex);
Color itemColor = e.Item.ForeColor;
if (e.Item.Selected && !lvEditMode) {
if (e.ColumnIndex == 0 || lView.FullRowSelect) {
using (var bkgrBrush = new SolidBrush(listViewSelectionColor)) {
e.Graphics.FillRectangle(bkgrBrush, e.Bounds);
}
itemColor = e.Item.BackColor;
}
}
else {
e.DrawBackground();
}
TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.SubItem.Font, e.Bounds, itemColor, flags);
}
protected void listView1_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e)
=> e.DrawDefault = true;
private TextFormatFlags GetTextAlignment(ListView lstView, int colIndex)
{
TextFormatFlags flags = (lstView.View == View.Tile)
? (colIndex == 0) ? TextFormatFlags.Default : TextFormatFlags.Bottom
: TextFormatFlags.VerticalCenter;
if (lstView.View == View.Details) flags |= TextFormatFlags.LeftAndRightPadding;
if (lstView.Columns[colIndex].TextAlign != HorizontalAlignment.Left) {
flags |= (TextFormatFlags)((int)lstView.Columns[colIndex].TextAlign ^ 3);
}
return flags;
}
private void listView1_BeforeLabelEdit(object sender, LabelEditEventArgs e) => lvEditMode = true;
private void listView1_AfterLabelEdit(object sender, LabelEditEventArgs e) => lvEditMode = false;
- 1 回答
- 0 關(guān)注
- 226 瀏覽
添加回答
舉報(bào)