/// <summary> /// /// </summary> /// <param name="g"></param> private void OnDraw(Graphics g) { // Background using (var brush = new SolidBrush(BackColor)) { g.FillRectangle(brush, ClientRectangle); } // Element var rect = ClientRectangle; if (borderTop || borderBottom || borderLeft || borderRight) { rect.Inflate(-1, -1); } var context = new TemplateDrawContext { PreferBaseForeColor = false, PreferBaseBackColor = false, PreferBaseBorderColor = false, BaseForeColor = ForeColor, BaseBackColor = BackColor, BaseBorderColor = ElementBorderColor, Font = Font }; var designMode = (Site != null) && Site.DesignMode; var source = designData as ITemplateDesignData; var target = designMode & source != null?source.Create() : item; TemplateDrawHelper.DrawElements(g, rect, target, elements, context); // Border g.DrawBorder(borderColor, ClientRectangle, borderTop, borderBottom, borderLeft, borderRight); }
/// <summary> /// /// </summary> /// <param name="g"></param> private void OnDraw(Graphics g) { // Background using (var brush = new SolidBrush(BackColor)) { g.FillRectangle(brush, ClientRectangle); } // Element var rect = ClientRectangle; if (borderTop || borderBottom || borderLeft || borderRight) { rect.Inflate(-1, -1); } var context = new TemplateDrawContext { PreferBaseForeColor = false, PreferBaseBackColor = false, PreferBaseBorderColor = false, BaseForeColor = ForeColor, BaseBackColor = BackColor, BaseBorderColor = ElementBorderColor, Font = Font }; var designMode = (Site != null) && Site.DesignMode; var source = designData as ITemplateDesignData; var target = designMode & source != null ? source.Create() : item; TemplateDrawHelper.DrawElements(g, rect, target, elements, context); // Border g.DrawBorder(borderColor, ClientRectangle, borderTop, borderBottom, borderLeft, borderRight); }
//-------------------------------------------------------------------------------- // Draw //-------------------------------------------------------------------------------- /// <summary> /// /// </summary> /// <param name="g"></param> protected override void OnDraw(Graphics g) { // Elements var rect = CalcListRect(); g.Clip = new Region(rect); var context = new TemplateDrawContext { BaseBorderColor = SplitterColor, Font = Font }; var designMode = (Site != null) && Site.DesignMode; var baseY = rect.Top; var source = designData as ITemplateListDesignData; var list = designMode && source != null ? (IList)source.Create() : items; var i = designMode ? 0 : TopIndex; var max = designMode && list != null ? list.Count : items.Count; if (list != null) { while ((baseY < rect.Bottom) && (i < max)) { var elementRect = new Rectangle(rect.Left, baseY, rect.Width, itemHeight); var selected = i == selectedIndex; var foreColor = selected ? (Focused ? selectedForeColor : inactiveSelectedForeColor) : ForeColor; var backColor = selected ? (Focused ? selectedBackColor : inactiveSelectedBackColor) : (i % 2 == 0) ? BackColor : alternateBackColor; using (var brush = new SolidBrush(backColor)) { g.FillRectangle(brush, elementRect); } context.PreferBaseForeColor = selected && PreferForeColorWhenSelected; context.PreferBaseBackColor = selected && PreferBackColorWhenSelected; context.PreferBaseBorderColor = selected && PreferBorderColorWhenSelected; context.BaseForeColor = foreColor; context.BaseBackColor = backColor; TemplateDrawHelper.DrawElements(g, elementRect, list[i], elements, context); baseY += itemHeight; if (splitter) { using (var brush = new SolidBrush(SplitterColor)) { g.FillRectangle(brush, new Rectangle(rect.Left, baseY, rect.Width, 1)); } baseY += 1; } i++; } } using (var brush = new SolidBrush(BackColor)) { g.FillRectangle(brush, rect.X, baseY, rect.Width, rect.Bottom - baseY); } // Border g.Clip = new Region(ClientRectangle); using (var pen = new Pen(borderColor)) { g.DrawRectangle(pen, ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width - 1, ClientRectangle.Height - 1); } }
/// <summary> /// /// </summary> /// <param name="g"></param> /// <param name="rect"></param> /// <param name="item"></param> /// <param name="elements"></param> /// <param name="context"></param> public static void DrawElements(Graphics g, Rectangle rect, object item, IList elements, TemplateDrawContext context) { var current = g.Clip; foreach (TemplateElement element in elements) { var elementRect = new Rectangle(rect.X + element.Point.X, rect.Y + element.Point.Y, element.Size.Width, element.Size.Height); var elementRegion = new Region(elementRect); var hasBorder = element.BorderTop || element.BorderBottom || element.BorderLeft || element.BorderRight; g.Clip = elementRegion; // Background if (!context.PreferBaseBackColor) { var color = ResolveValue(item, element.BackColor, element.BackColorProperty, element.BackColorConverter); if (!color.Equals(Color.Transparent)) { using (var br = new SolidBrush(color)) { g.FillRectangle(br, elementRect); } } } // Image var image = ResolveValue(item, element.Image, element.ImageProperty, element.ImageConverter); if (image != null) { var imageRect = elementRect; if (hasBorder) { imageRect.Inflate(-1, -1); } var rc = element.TextAlign.CalcTextRect(image.Width, image.Height, imageRect); g.DrawImage(image, (int)rc.X, (int)rc.Y); } // Text var text = ResolveValue(item, element.Text, element.TextProperty, element.TextConverter); if (text != null) { var color = context.PreferBaseForeColor ? context.BaseForeColor : ResolveValue(item, element.ForeColor, element.ForeColorProperty, element.ForeColorConverter); if (color.Equals(Color.Transparent)) { color = context.BaseForeColor; } var font = ResolveValue(item, element.Font, element.FontProperty, element.FontConverter) ?? context.Font; var textRect = elementRect; textRect.X += element.Padding.Width; textRect.Y += element.Padding.Height; textRect.Width -= element.Padding.Width * 2; textRect.Height -= element.Padding.Height * 2; if (hasBorder) { textRect.Inflate(-1, -1); } if (element.Multiline) { var texts = g.GetMultilineText(text, font, textRect.Width); var textSize = g.CalcMultilineTextSize(texts, font); var rc = element.TextAlign.CalcTextRect(textSize, textRect); using (var br = new SolidBrush(color)) { var top = rc.Top; foreach (var line in texts) { var size = g.MeasureString(String.IsNullOrEmpty(line) ? " " : line, font); var rcLine = element.TextAlign.CalcTextRect(size, rc.Left, top, rc.Width, size.Height); g.DrawString(line, font, br, rcLine.X, rcLine.Y); top += rcLine.Height; } } } else { var rc = element.TextAlign.CalcTextRect(g.MeasureString(text, font), textRect); using (var br = new SolidBrush(color)) { g.Clip = new Region(textRect); g.DrawString(text, font, br, rc); g.Clip = elementRegion; } } } // Border if (hasBorder) { var color = context.PreferBaseBorderColor ? context.BaseBorderColor : ResolveValue(item, element.BorderColor, element.BorderColorProperty, element.BorderColorConverter); if (color.Equals(Color.Transparent)) { color = context.BaseBorderColor; } g.DrawBorder(color, elementRect, element.BorderTop, element.BorderBottom, element.BorderLeft, element.BorderRight); } } g.Clip = current; }