New to Telerik UI for WinFormsStart a free 30-day trial

Add watermark to RadRibbonBar

Updated over 6 months ago

Environment

Product VersionProductAuthor
2022.1.222RadRibbonBar for WinFormsDinko Krastev

Description

To add a watermark image inside the RadRibbonBar control, we can create a custom class that derives from RadRibbonBarElement. The custom RadRibbonBarElement will have an additional element that will paint the watermark (image). The important part here is that the newly created element will need to be arranged so that it is positioned per your requirements. In the following solution, we will place a watermark next to the system buttons.

Solution

  1. First we will create a custom RadRibbonBarElement and add a LightVisualElement object which will host the image.
C#

public class CustomRadRibbonBarElement : RadRibbonBarElement
{
	private LightVisualElement watermarkElement;

	protected override void InitializeFields()
	{
		base.InitializeFields();
	}

	protected override void OnLoaded()
	{
		base.OnLoaded();
		
		this.DrawFill = true;
		this.BackColor = Color.White;
		this.GradientStyle = GradientStyles.Solid;
		this.TabStripElement.BackColor = Color.Transparent;
	}

	protected override void CreateChildElements()
	{
		base.CreateChildElements();

		this.watermarkElement = new LightVisualElement();
		this.watermarkElement.StretchHorizontally = this.watermarkElement.StretchVertically = false;
		this.watermarkElement.ShouldHandleMouseInput = false;
		this.watermarkElement.NotifyParentOnMouseInput = true;

		this.Children.Add(this.watermarkElement);

	}

	protected override Type ThemeEffectiveType
	{
		get
		{
			return typeof(RadRibbonBarElement);
		}
	}

	public LightVisualElement WatermarkElement
	{
		get { return this.watermarkElement; }
	}

	public Image Watermark
	{
		get { return this.WatermarkElement.Image; }
		set { this.WatermarkElement.Image = value; }
	}

	protected override SizeF MeasureOverride(SizeF availableSize)
	{
		SizeF result = base.MeasureOverride(availableSize);

		this.watermarkElement.Measure(availableSize);
		return result;
	}

	protected override SizeF ArrangeOverride(SizeF finalSize)
	{
		SizeF result = base.ArrangeOverride(finalSize);
		
		RectangleF clientRect = this.GetClientRectangle(finalSize);
		RectangleF watermarkRect = new RectangleF();
		watermarkRect.X = clientRect.Right /*- this.RibbonCaption.SystemButtons.DesiredSize.Width*/ - this.WatermarkElement.DesiredSize.Width - this.WatermarkElement.Margin.Right;
		watermarkRect.Y = this.WatermarkElement.Margin.Top;
		watermarkRect.Size = this.WatermarkElement.DesiredSize;

		this.watermarkElement.Arrange(watermarkRect);

		return result;
	}
}	
  1. The final step is to replace the default RadRibbonBarElement object with the custom one created above.
C#

public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
    public RadForm1()
    {
        InitializeComponent();
        this.radRibbonBar1.Watermark = Image.FromFile(@"..\..\progress320.png");
    }
}   

public class CustomRadRibbonBar : RadRibbonBar
{
    private CustomRadRibbonBarElement customRibbonBarElement;

    public override string ThemeClassName
    {
        get
        {
            return typeof(RadRibbonBar).FullName;
        }
    }

    protected override RadRibbonBarElement CreateRibbonBarElement()
	{
		customRibbonBarElement = new CustomRadRibbonBarElement();
		return customRibbonBarElement;
	}
	
	protected override void CreateChildItems(RadElement parent)
	{
		base.CreateChildItems(parent);
	}

    public Image Watermark
    {
        get { return this.customRibbonBarElement.Watermark; }
        set { this.customRibbonBarElement.Watermark = value; }
    }
}
In this article
EnvironmentDescriptionSolution
Not finding the help you need?
Contact Support