C#設計帶表徵圖和自訂色彩的ListBox

來源:互聯網
上載者:User
設計

  在一個點對點檔案傳輸的項目中,我需要顯示檔案傳輸的即時資訊:傳輸的檔案清單和當前傳輸的檔案,當時我想到了用ListBox,但是但我用了ListBox後,我發現它不能改變控制項中文本想的顏色,於是我就想擴充一下ListBox控制項------ListBoxEx。

  我的目標是給空間加上表徵圖,還要能時時改變控制項文本顏色。於是從ListBox衍生類別

public class ListBoxEx : ListBox {…}

  為了操作方便我為ListBoxEx的每一項設計專門的類ListBoxExItem

public class ListBoxExItem {…}

  為了保持我這個控制項與WinForm的標準控制項的操作借口一致,我又重新設計了兩個集合類:

public class ListBoxExItemCollection : IList, ICollection, IEnumerator {}
//這個類相對於標準ListBox中的ObjectCollection,這個類作為ListBoxEx中的Items屬性的類型

public class SelectedListBoxExItemCollection : : IList, ICollection, IEnumerator{}
//這個類相對於標準ListBox中的SelectedObjectCollection,這個類作為ListBoxEx中的SelectedItems屬性的類型

  下面看兩個集合類的實現:

  ListBoxExItemCollection的實現:為了做到對集合(Items)的操作能夠及時反映到ListBoxEx的控制項中所以,此類只是對ListBox中Items(ObjectCollection類型)作了一層封裝,就是把ListBox中Items屬性的所有方法的只要是object類型的參數都轉換成ListBoxExItem,比如:

public void Remove(ListBoxExItem item)
{
 this._Items.Remove(item); //_Items為ObjectCollection類型
}

public void Insert(int index, ListBoxExItem item)
{
 this._Items.Insert(index, item);
}

public int Add(ListBoxExItem item)
{
 return this._Items.Add(item);
}

  由上可知,ListBoxExItemCollection中有一個建構函式來傳遞ListBox中的Items對象

private ObjectCollection _Items;

public ListBoxExItemCollection(ObjectCollection baseItems)
{
 this._Items = baseItems;
}

  而SelectedListBoxExItemCollection類的實現也用同樣的方法,只不過是對SelectedObjectCollection封裝罷了。

  集合實現後,再來看ListBoxExItem的實現:

  為了使它支援表徵圖和多種顏色添加如下成員
 

private int _ImageIndex;

public int ImageIndex
{
 get { return this._ImageIndex; }
 set { this._ImageIndex = value;}
}

private Color _ForeColor;

public Color ForeColor
{
 get{ return this._ForeColor;}
 set
 {
  this._ForeColor = value;
  this.Parent.Invalidate();
 }
}

  當然還有:

private string _Text;

public string Text
{
 get { return this._Text; }
 set { this._Text = value; }
}

  為了控制項能正確顯示此項的文本,還必須重寫ToString()方法

public override string ToString()
{
 return this._Text;
}

  再看ListBoxEx的實現:

  為了使控制項能夠自我繪製,所以:DrawMode = DrawMode.OwnerDrawFixed;

  為了覆蓋基類的Items等相關屬性添加

 

private ListBoxExItemCollection _Items; //在建構函式中建立

  同時還需要重寫屬性Items:

 new public ListBoxExItemCollection Items
{
 get
 {
  return this._Items;
 }
}

new public ListBoxExItem SelectedItem //強制轉換為ListBoxExItem
{
 get{ return base.SelectedItem as ListBoxExItem;}
 set{ base.SelectedItem = value;}
}

new public SelectedListBoxExItemCollection SelectedItems //重新封裝SelectedItems
{
 get
 {
  return new SelectedListBoxExItemCollection(base.SelectedItems);
 }
}

  為了支援表徵圖,添加一個映像列表imagelist

 private ImageList imageList;

public ImageList ImageList
{
 get { return this.imageList; }
 set
 {
  this.imageList = value;
  this.Invalidate();//映像列表改變後馬上更新控制項
 }
}

  而此控制項的核心卻在一個方法OnDrawItem,這個方法每當控制項的項需要重繪時就被調用

 

protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs pe)
{
 pe.DrawBackground(); //畫背景
 pe.DrawFocusRectangle(); //畫邊框
 Rectangle bounds = pe.Bounds;

 // Check whether the index is valid

if(pe.Index >= 0 && pe.Index < base.Items.Count)
{
 ListBoxExItem item = this.Items[pe.Index]; //取得需要繪製項的引用
 int iOffset = 0;

// If the image list is present and the image index is set, draw the image

 if(this.imageList != null)
 {
  if (item.ImageIndex > -1 && item.ImageIndex < this.imageList.Images.Count)
  {
    this.imageList.Draw(pe.Graphics, bounds.Left, bounds.Top, bounds.Height, bounds.Height, item.ImageIndex); //繪製表徵圖
  }
  iOffset += bounds.Height;//this.imageList.ImageSize.Width;
 }

 // Draw item text

 pe.Graphics.DrawString(item.Text, pe.Font, new SolidBrush(item.ForeColor),bounds.Left + iOffset, bounds.Top); //根據項的顏色繪製文本

 }
 base.OnDrawItem(pe);
 }
}

  到此為止,ListBoxEx以完整的實現,並且支援可視化設計。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。