private void UpdateOffsets(Graphics g) { myOffsets = new int[myPainters.Length]; int offset = 0; for (int i = 0; i < myPainters.Length; i++) { IItemPainter painter = myPainters[i]; myOffsets[i] = offset; int maxWidth = 0; foreach (ListViewItem item in myItems) { Size size = painter.GetSize(item, g); if (size.Width > maxWidth) { maxWidth = size.Width; } } offset += maxWidth + SPACING; } myWidth = offset; myOffsetsAreCorrect = true; }
public void Draw(ListViewItem item, Graphics g, Rectangle rect) { if (!myOffsetsAreCorrect) { UpdateOffsets(g); } int startOffset = CalculateOffset(item); for (int i = 0; i < myPainters.Length; i++) { IItemPainter painter = myPainters[i]; Size size = painter.GetSize(item, g); int offset = myOffsets[i] + startOffset; int endOffset = i == myPainters.Length - 1 ? rect.Width : myOffsets[i + 1]; switch (myAlignments[i]) { case ColumnAlignment.Right: offset += (endOffset - offset) - size.Width; break; case ColumnAlignment.Center: offset += ((endOffset - offset) - size.Width) / 2; break; } painter.Draw(item, g, new Rectangle(offset, 0, endOffset - offset, 0)); } }
public Size GetItemSize(ListViewItem item) { try { using (Graphics g = CreateGraphics()) { return(myItemPainter.GetSize(item, g)); } } catch (Exception ex) { System.Diagnostics.Trace.WriteLine("CustomListView.GetItemSize failed : " + ex, "UI"); return(new Size(1, 1)); } }
protected override void OnMeasureItem(MeasureItemEventArgs e) { try { if (myItemPainter != null) { Size size = myItemPainter.GetSize(Items[e.Index], e.Graphics); e.ItemWidth = size.Width; e.ItemHeight = size.Height; } else { base.OnMeasureItem(e); } } catch (Exception ex) { System.Diagnostics.Trace.WriteLine("CustomListBox.MeasureItem failed : " + ex, "UI"); } }