public void Render(Cairo.Context c, Control control) { TextBlock textBlock = control as TextBlock; Rectangle borderRect; c.Save(); borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, textBlock.Height); if (!textBlock.CanGrow || DesignMode) { c.ClipRectangle(borderRect); } var rect = c.DrawTextBlock(textBlock, false); if (!DesignMode && (textBlock.CanGrow && rect.Height > textBlock.Height || textBlock.CanShrink && rect.Height < textBlock.Height)) { borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, rect.Height); } else { borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, textBlock.Height); } c.FillRectangle(borderRect, textBlock.BackgroundColor.ToCairoColor()); c.DrawTextBlock(textBlock, true); c.DrawInsideBorder(borderRect, textBlock.Border, true); c.Restore(); }
/// <summary> /// Breaks off contol at most at height. /// </summary> /// <returns> /// Array of two controls: broken control with height equal to height param or lower and second control representing rest part of oryginal control /// </returns> /// <param name='control'> /// Control to broke off /// </param> /// <param name='height'> /// Height. /// </param> public Control[] BreakOffControlAtMostAtHeight(Cairo.Context c, Control control, double height) { Control[] controls = new Control[2]; TextBlock textBlock = control.CreateControl() as TextBlock; controls[1] = textBlock; var newTextBlock = control.CreateControl() as TextBlock; textBlock.Top = 0; int charNumber = c.GetBreakLineCharacterIndexbyMaxHeight(textBlock, height); if (charNumber > 0) { newTextBlock.Text = textBlock.Text.Substring(0, charNumber - 1); newTextBlock.Padding = new Thickness(textBlock.Padding.Left, 0, textBlock.Padding.Right, textBlock.Padding.Bottom); var newSize = c.DrawTextBlock(newTextBlock, false); newTextBlock.Height = newSize.Height; textBlock.Height = textBlock.Height - newSize.Height; textBlock.Text = textBlock.Text.Substring(charNumber - 1); } else if (charNumber == 0) { newTextBlock.Height = textBlock.Padding.Top; newTextBlock.Text = String.Empty; textBlock.Height = textBlock.Height - newTextBlock.Height; } else if (charNumber == -1) { newTextBlock.Height = height; newTextBlock.Text = String.Empty; textBlock.Height = textBlock.Height - height; textBlock.Padding = new Thickness(textBlock.Padding.Left, textBlock.Padding.Top - height, textBlock.Padding.Right, textBlock.Padding.Bottom); } else if (charNumber == -2) { newTextBlock.Height = height; textBlock.Text = String.Empty; textBlock.FieldName = String.Empty; textBlock.Height = textBlock.Height - height; textBlock.Padding = new Thickness(textBlock.Padding.Left, textBlock.Padding.Top - height, textBlock.Padding.Right, textBlock.Padding.Bottom); } controls[0] = newTextBlock; return(controls); }
public Size Measure(Cairo.Context c, Control control) { TextBlock textBlock = control as TextBlock; Rectangle borderRect; var rect = c.DrawTextBlock(textBlock, false); if (textBlock.CanGrow && rect.Height > textBlock.Height || textBlock.CanShrink && rect.Height < textBlock.Height) { borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, rect.Height); } else { borderRect = new Rectangle(textBlock.Location.X, textBlock.Location.Y, textBlock.Width, textBlock.Height); } return(new Size(borderRect.Width, borderRect.Height)); }