WinForm中如何讓ListBox多行顯示

前陣子開發(fā)一個小軟件与斤,由于添加到ListBox中的單項文本可能會非常長。默認情況下ListBox會只顯示一部分:

而這個軟件要求每一項如果內容多了就多行顯示尼斧,也就是如下的效果:

????這個就用到了WinForm中的自繪(OwnerDraw)技術姜贡,也就是自定義控件的繪制代替系統(tǒng)的默認繪制,做法也比較套路:1)設置控件的DrawMode屬性為OwnerDrawVariable棺棵;2)監(jiān)聽控件的MeasureItem事件楼咳,計算每一項的顯示高度;3)監(jiān)聽控件的DrawItem事件烛恤,繪制每一項的內容母怜。

具體例子代碼如下:

using System;

using System.Drawing;

using System.Windows.Forms;

namespace WindowsFormsApp9

{

? ? public partial class Form1 : Form

? ? {

? ? ? ? private const int ITEM_PADDING = 10;//各項之間的邊距

? ? ? ? public Form1()

? ? ? ? {

? ? ? ? ? ? InitializeComponent();

? ? ? ? ? ? listBox1.DrawMode = DrawMode.OwnerDrawVariable;

? ? ? ? ? ? listBox1.DrawItem += ListBox1_DrawItem;

? ? ? ? ? ? listBox1.MeasureItem += ListBox1_MeasureItem;

? ? ? ? ? ? string[] items = new string[]{ "DNSPod稱,該事件將影響部分家用路由器用戶缚柏,訪問所有網絡服務時DNS解析被調度到江蘇電信或周邊線路苹熏,因跨網、跨省币喧、節(jié)點容量等原因造成訪問延遲升高或訪問失敗轨域。",

? ? ? ? ? ? ? ? "近日我們監(jiān)控到多起客戶在全國各地各運營商流量被調度到江蘇電信的問題,經過與第三方的合作分析排查確認粱锐,這是一起大規(guī)模的黑產攻擊事件疙挺,非DNSPod問題。",

? ? ? ? ? ? ? ? "引導報障用戶檢查無線路由器DNS是否被黑客篡改怜浅,并及時修正DNS∈弑溃可改為運營商默認DNS或者我們對外提供的公共DNS:119.29.29.29或119.28.28.28恶座。建議DNSPod客戶臨時將江蘇電信線路調整使用BGP節(jié)點進行覆蓋。目前DNSPod也在聯(lián)合第三方和有關部門(CNCERT等)進一步分析處理沥阳,有最新消息將及時同步跨琳,詳情請關注后續(xù)DNSPod及CNCERT的公告。" };

? ? ? ? ? ? listBox1.Items.AddRange(items);

? ? ? ? }

? ? ? ? private void ListBox1_MeasureItem(object sender, MeasureItemEventArgs e)

? ? ? ? {

? ? ? ? ? ? ListBox listBox = sender as ListBox;

? ? ? ? ? ? int index = e.Index;//獲取當前要進行繪制的行的序號桐罕,從0開始脉让。

? ? ? ? ? ? if (index < 0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? ? ? string text = Convert.ToString(listBox.Items[index]);


? ? ? ? ? ? //超范圍后自動換行

? ? ? ? ? ? Size size = TextRenderer.MeasureText(index + ":" + text, listBox.Font, listBox.Size, TextFormatFlags.WordBreak);

? ? ? ? ? ? e.ItemWidth = size.Width;

? ? ? ? ? ? e.ItemHeight = size.Height + ITEM_PADDING*2;//適當多一點高度桂敛,避免太擠

? ? ? ? }

? ? ? ? private void ListBox1_DrawItem(object sender, DrawItemEventArgs e)

? ? ? ? {

? ? ? ? ? ? int index = e.Index;//獲取當前要進行繪制的行的序號,從0開始溅潜。

? ? ? ? ? ? if (index < 0)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? return;

? ? ? ? ? ? }

? ? ? ? ? ? ListBox listBox = sender as ListBox;

? ? ? ? ? ? e.DrawBackground();//畫背景顏色

? ? ? ? ? ? e.DrawFocusRectangle();//畫聚焦項的邊框

? ? ? ? ? ? Graphics g = e.Graphics;//獲取Graphics對象术唬。

? ? ? ? ? ? Rectangle itemBounds = e.Bounds;//獲取當前要繪制的行的一個矩形范圍。

? ? ? ? ? ? //文字繪制的區(qū)域滚澜,留出一定間隔

? ? ? ? ? ? Rectangle textBounds = new Rectangle(itemBounds.X, itemBounds.Y + ITEM_PADDING, itemBounds.Width, itemBounds.Height);

? ? ? ? ? ? string text = Convert.ToString(listBox.Items[index]);

? ? ? ? ? ? //因為文本可能會非常長粗仓,因此要用自繪實現(xiàn)ListBox項目的自動換行

? ? ? ? ? ? TextRenderer.DrawText(g, index + ":" + text, e.Font, textBounds, e.ForeColor,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? TextFormatFlags.WordBreak);

? ? ? ? ? ? g.DrawRectangle(Pens.Blue, itemBounds);//畫每一項的邊框,這樣清楚分出來各項设捐。

? ? ? ? }

? ? }

}

最后感慨一下借浊,類似這樣的效果如果用WPF或者Electron等hybrid的解決方案,完全沒必要這么麻煩萝招,幾行代碼就搞定蚂斤,這里強烈建議大家以及我自己:開發(fā)窗口程序盡量不要用WinForm了,復雜效果很麻煩的槐沼,WPF橡淆、Electron等是更好的選擇。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末母赵,一起剝皮案震驚了整個濱河市逸爵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凹嘲,老刑警劉巖师倔,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異周蹭,居然都是意外死亡趋艘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門凶朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓷胧,“玉大人,你說我怎么就攤上這事棚愤〈晗簦” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵宛畦,是天一觀的道長瘸洛。 經常有香客問我,道長次和,這世上最難降的妖魔是什么反肋? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮踏施,結果婚禮上石蔗,老公的妹妹穿的比我還像新娘罕邀。我一直安慰自己,他們只是感情好养距,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布诉探。 她就那樣靜靜地躺著,像睡著了一般铃在。 火紅的嫁衣襯著肌膚如雪阵具。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天定铜,我揣著相機與錄音阳液,去河邊找鬼。 笑死揣炕,一個胖子當著我的面吹牛帘皿,可吹牛的內容都是我干的。 我是一名探鬼主播畸陡,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼鹰溜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丁恭?” 一聲冷哼從身側響起曹动,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎牲览,沒想到半個月后墓陈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡第献,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年贡必,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片庸毫。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡仔拟,死狀恐怖,靈堂內的尸體忽然破棺而出飒赃,到底是詐尸還是另有隱情利花,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布盒揉,位于F島的核電站晋被,受9級特大地震影響,放射性物質發(fā)生泄漏刚盈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一挂脑、第九天 我趴在偏房一處隱蔽的房頂上張望藕漱。 院中可真熱鬧欲侮,春花似錦、人聲如沸肋联。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橄仍。三九已至韧涨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侮繁,已是汗流浹背虑粥。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宪哩,地道東北人娩贷。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像锁孟,于是被迫代替她去往敵國和親彬祖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,092評論 1 32
  • 1品抽、窗體 1储笑、常用屬性 (1)Name屬性:用來獲取或設置窗體的名稱,在應用程序中可通過Name屬性來引用窗體圆恤。 ...
    Moment__格調閱讀 4,522評論 0 11
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程突倍,因...
    小菜c閱讀 6,365評論 0 17
  • 熱鬧中著一冷眼,便省許多苦心思哑了;冷落處存一熱心赘方,便得許多真趣味。
    Ada心依閱讀 343評論 0 1
  • 在整個生態(tài)中弱左,作為一個運營從業(yè)者窄陡,你可能需要從一些很小很碎的點開始進入(例如內容的生產、編輯或者審核)拆火,然后再一步...
    人言白一閱讀 173評論 0 0