Completed
Last Updated: 29 Apr 2019 06:53 by ADMIN
Release R2 2019
Nikolay
Created on: 27 Mar 2019 07:53
Category: UI for WinForms
Type: Bug Report
1
RadCommandBar: Saved layout is not restored correctly on High DPI
The desired location of the command bar strip elements is saved with a scaled location.
1 comment
ADMIN
Hristo
Posted on: 27 Mar 2019 07:58
Hi,

The issue can be easily reproduced by saving and loading the layout on High DPI.

Workaround: save the layout descaling the location of the strips. A sample approach is demonstrated below: 
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
    public RadForm1()
    {
        InitializeComponent();
    }
 
    string layout = @"..\..\layout.xml";
    private void radButton1_Click(object sender, EventArgs e)
    {
        XmlDocument doc = this.SaveLayoutCore();
        doc.Save(layout);
    }
 
    private XmlDocument SaveLayoutCore()
    {
        XmlDocument doc = new XmlDocument();
        XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", null, null);
        doc.AppendChild(dec);
        XmlElement rootNode = doc.CreateElement("RadCommandBarElement");
        rootNode.SetAttribute("Orientation", this.radCommandBar1.CommandBarElement.Orientation.ToString());
        rootNode.SetAttribute("Name", this.Name);
        rootNode.SetAttribute("RTL", this.RightToLeft.ToString());
 
        for (int i = 0; i < this.radCommandBar1.CommandBarElement.Rows.Count; i++)
        {
            CommandBarRowElement lineElement = this.radCommandBar1.CommandBarElement.Rows[i];
            XmlElement lineNode = doc.CreateElement("CommandBarRowElement");
            lineNode.SetAttribute("Orientation", lineElement.Orientation.ToString());
            lineNode.SetAttribute("Name", lineElement.Name);
            lineNode.SetAttribute("LineIndex", i.ToString());
 
            foreach (CommandBarStripElement stripElement in lineElement.Strips)
            {
                XmlElement stripNode = doc.CreateElement("CommandBarStripElement");
                stripNode.SetAttribute("Orientation", stripElement.Orientation.ToString());
                stripNode.SetAttribute("Name", stripElement.Name);
                stripNode.SetAttribute("DesiredLocationX", this.DescaleFloat(stripElement.DesiredLocation.X).ToString());
                stripNode.SetAttribute("DesiredLocationY", this.DescaleFloat(stripElement.DesiredLocation.Y).ToString());
                stripNode.SetAttribute("VisibleInCommandBar", stripElement.VisibleInCommandBar.ToString());
                stripNode.SetAttribute("StretchHorizontally", stripElement.StretchHorizontally.ToString());
                stripNode.SetAttribute("StretchVertically", stripElement.StretchVertically.ToString());
                stripNode.SetAttribute("EnableFloating", stripElement.EnableFloating.ToString());
                stripNode.SetAttribute("EnableDragging", stripElement.EnableDragging.ToString());
 
                int currentIndex = 0;
                for (int j = 0; j < stripElement.Items.Count; j++)
                {
                    RadCommandBarBaseItem itemElement = stripElement.Items[j];
                    XmlElement itemNode = doc.CreateElement("RadCommandBarBaseItem");
                    itemNode.SetAttribute("Orientation", itemElement.Orientation.ToString());
                    itemNode.SetAttribute("Name", itemElement.Name);
                    itemNode.SetAttribute("VisibleInStrip", itemElement.VisibleInStrip.ToString());
                    itemNode.SetAttribute("StretchHorizontally", itemElement.StretchHorizontally.ToString());
                    itemNode.SetAttribute("StretchVertically", itemElement.StretchVertically.ToString());
                    itemNode.SetAttribute("Index", currentIndex.ToString());
                    stripNode.AppendChild(itemNode);
                    ++currentIndex;
                }
 
                for (int j = 0; j < stripElement.OverflowButton.OverflowPanel.Layout.Children.Count; j++)
                {
                    RadCommandBarBaseItem itemElement = stripElement.OverflowButton.OverflowPanel.Layout.Children[j] as RadCommandBarBaseItem;
                    if (itemElement == null)
                    {
                        continue;
                    }
 
                    XmlElement itemNode = doc.CreateElement("RadCommandBarBaseItem");
                    itemNode.SetAttribute("Orientation", itemElement.Orientation.ToString());
                    itemNode.SetAttribute("Name", itemElement.Name);
                    itemNode.SetAttribute("VisibleInStrip", itemElement.VisibleInStrip.ToString());
                    itemNode.SetAttribute("StretchHorizontally", itemElement.StretchHorizontally.ToString());
                    itemNode.SetAttribute("StretchVertically", itemElement.StretchVertically.ToString());
                    itemNode.SetAttribute("Index", currentIndex.ToString());
                    stripNode.AppendChild(itemNode);
                    ++currentIndex;
                }
 
 
                lineNode.AppendChild(stripNode);
            }
 
            rootNode.AppendChild(lineNode);
        }
 
        XmlElement floatingFormsNode = SaveFloatingStripsLayout(doc);
        rootNode.AppendChild(floatingFormsNode);
        doc.AppendChild(rootNode);
 
        return doc;
    }
 
    private XmlElement SaveFloatingStripsLayout(XmlDocument doc)
    {
        XmlElement floatingFormsNode = doc.CreateElement("FloatingStrips");
        foreach (CommandBarStripElement stripElement in this.radCommandBar1.CommandBarElement.StripInfoHolder.StripInfoList)
        {
            if (stripElement.FloatingForm == null || stripElement.FloatingForm.IsDisposed)
            {
                continue;
            }
 
            XmlElement stripNode = doc.CreateElement("CommandBarStripElement");
            stripNode.SetAttribute("Orientation", stripElement.Orientation.ToString());
            stripNode.SetAttribute("Name", stripElement.Name);
            stripNode.SetAttribute("DesiredLocationX", this.DescaleFloat(stripElement.DesiredLocation.X).ToString());
            stripNode.SetAttribute("DesiredLocationY", this.DescaleFloat(stripElement.DesiredLocation.Y).ToString());
            stripNode.SetAttribute("FormLocationX", stripElement.FloatingForm.Location.X.ToString());
            stripNode.SetAttribute("FormLocationY", stripElement.FloatingForm.Location.Y.ToString());
            stripNode.SetAttribute("VisibleInCommandBar", stripElement.VisibleInCommandBar.ToString());
            stripNode.SetAttribute("StretchHorizontally", stripElement.StretchHorizontally.ToString());
            stripNode.SetAttribute("StretchVertically", stripElement.StretchVertically.ToString());
            stripNode.SetAttribute("RTL", stripElement.RightToLeft.ToString());
            stripNode.SetAttribute("EnableFloating", stripElement.EnableFloating.ToString());
            stripNode.SetAttribute("EnableDragging", stripElement.EnableDragging.ToString());
 
            int currentIndex = 0;
            for (int j = 0; j < stripElement.Items.Count; j++)
            {
                RadCommandBarBaseItem itemElement = stripElement.Items[j];
                XmlElement itemNode = doc.CreateElement("RadCommandBarBaseItem");
                itemNode.SetAttribute("Orientation", itemElement.Orientation.ToString());
                itemNode.SetAttribute("Name", itemElement.Name);
                itemNode.SetAttribute("VisibleInStrip", itemElement.VisibleInStrip.ToString());
                itemNode.SetAttribute("StretchHorizontally", itemElement.StretchHorizontally.ToString());
                itemNode.SetAttribute("StretchVertically", itemElement.StretchVertically.ToString());
                itemNode.SetAttribute("Index", currentIndex.ToString());
                stripNode.AppendChild(itemNode);
                ++currentIndex;
            }
 
            for (int j = 0; j < stripElement.FloatingForm.ItemsHostControl.Element.Layout.Children.Count; j++)
            {
                RadCommandBarBaseItem itemElement = stripElement.FloatingForm.ItemsHostControl.Element.Layout.Children[j] as RadCommandBarBaseItem;
                if (itemElement == null)
                {
                    continue;
                }
 
                XmlElement itemNode = doc.CreateElement("RadCommandBarBaseItem");
                itemNode.SetAttribute("Orientation", itemElement.Orientation.ToString());
                itemNode.SetAttribute("Name", itemElement.Name);
                itemNode.SetAttribute("VisibleInStrip", itemElement.VisibleInStrip.ToString());
                itemNode.SetAttribute("StretchHorizontally", itemElement.StretchHorizontally.ToString());
                itemNode.SetAttribute("StretchVertically", itemElement.StretchVertically.ToString());
                itemNode.SetAttribute("Index", currentIndex.ToString());
                stripNode.AppendChild(itemNode);
                ++currentIndex;
            }
 
            floatingFormsNode.AppendChild(stripNode);
        }
        return floatingFormsNode;
    }
 
    private float DescaleFloat(float value)
    {
        SizeF descale = new SizeF(1 / this.radCommandBar1.RootElement.DpiScaleFactor.Width, 1 / this.radCommandBar1.RootElement.DpiScaleFactor.Height);
 
        return TelerikDpiHelper.ScaleFloat(value, descale);
    }
 
    private void radButton2_Click(object sender, EventArgs e)
    {
        this.radCommandBar1.CommandBarElement.LoadLayout(layout);
    }
}

Regards,
Hristo
Progress Telerik
Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.