Document window save state.

4 posts, 0 answers
  1. Hugues
    Hugues avatar
    54 posts
    Member since:
    Sep 2014

    Posted 28 Jan 2015 Link to this post

    I have notice that when i hide a document window and show it, it is showing back up in the main tab window. How can i get it to show up exactly where i had it close. The issue is that i have 4 document windows and i want my documents window to show back up exactly where they were before i hide them. I do notice that this seems to work with Tool windows, but i would like to know if it is possible with document windows.

    Thanks,
    Jerome.
  2. Hristo Merdjanov
    Admin
    Hristo Merdjanov avatar
    710 posts

    Posted 02 Feb 2015 Link to this post

    Hi Jerome,

    Thank you for writing.

    You could reach this type of behavior by subscribing to a number of events and manually updating the location of the hidden floating windows. I have prepared a sample implementation below:
    public partial class Form1 : Form
    {
        private Dictionary<string, Point> hiddenWindowsData = new Dictionary<string, Point>();
     
        public Form1()
        {
            InitializeComponent();
     
            this.Load += Form1_Load;
            this.radDock1.DockStateChanged += radDock1_DockStateChanged;
            this.radDock1.DockStateChanging += radDock1_DockStateChanging;
            this.radDock1.FloatingWindowCreated += radDock1_FloatingWindowCreated;
        }
     
        private void radDock1_DockStateChanged(object sender, DockWindowEventArgs e)
        {
            if (e.DockWindow.DockState == DockState.Floating)
            {
                e.DockWindow.FloatingParent.Tag = e.DockWindow.Text;
            }
        }
     
        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (DockWindow tW in this.radDock1.DockWindows.GetWindows(DockState.TabbedDocument))
            {
                tW.CloseAction = DockWindowCloseAction.Hide;
            }
        }
         
        private void radDock1_DockStateChanging(object sender, DockStateChangingEventArgs e)
        {
            if (e.NewDockState == DockState.Hidden)
            {
                hiddenWindowsData[e.NewWindow.Name] = e.NewWindow.FloatingParent.Location;
            }
        }
     
        private void radDock1_FloatingWindowCreated(object sender, FloatingWindowEventArgs e)
        {
            e.Window.Shown -= Window_Shown;
            e.Window.Shown += Window_Shown;
        }
     
        private void Window_Shown(object sender, EventArgs e)
        {
            FloatingWindow fW = sender as FloatingWindow;
            if (fW != null)
            {
                if (fW.Tag != null)
                {
                    fW.Text = fW.Tag.ToString();
                }
                if (hiddenWindowsData.ContainsKey(fW.Text))
                {
                    fW.Location = hiddenWindowsData[fW.Text];
                }
     
            }
        }
     
        private void radButton1_Click(object sender, EventArgs e)
        {
            DockWindow[] hiddenWindows = this.radDock1.DockWindows.GetWindows(DockState.Hidden);
            foreach (DockWindow window in hiddenWindows)
            {
                window.Show();
            }
        }
    }

    I am also sending you a gif file showing how the elements look on my side.

    I hope this information is helpful. Should you have further questions please do no hesitate to write back.

    Regards,
    Hristo Merdjanov
    Telerik
     

    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

     
  3. UI for WinForms is Visual Studio 2017 Ready
  4. Hugues
    Hugues avatar
    54 posts
    Member since:
    Sep 2014

    Posted 02 Feb 2015 in reply to Hristo Merdjanov Link to this post

    This seems to work only if the windows if floating. How about if the document window is already docked to something and i hide it. Would it remember the position and also where it was previously dock to. I want the document window to be at the exact state it was before i close it. So if it was docked, it should remain dock if i open it again.

    Thanks.
  5. Hristo Merdjanov
    Admin
    Hristo Merdjanov avatar
    710 posts

    Posted 05 Feb 2015 Link to this post

    Hi Hugues,

    Thank you for writing back.

    Currently the RadDock control does not provide a functionality for saving the position of hidden document windows. When a docked document window gets hidden its container element the DocumentTabStrip becomes disposed and when the window is shown again it gets a position in the default DocumentTabStrip. We have a feature request regarding this type of functionality, you can subscribe for updates and cast your vote here

    As a possible workaround I can suggest saving the RadDock layout to XML whenever a document window gets hidden and when it appears load the already saved layout. Have in mind that this approach has a number of limitation because the layout would be saved when only a document window is hidden:
    public partial class Form1 : Form
    {
        private bool isRestored = false;
     
        public Form1()
        {
            InitializeComponent();
     
            this.Load += Form1_Load;
            this.radDock1.DockStateChanged += radDock1_DockStateChanged;
            this.radDock1.DockStateChanging += radDock1_DockStateChanging;
        }
     
        private void radDock1_DockStateChanged(object sender, DockWindowEventArgs e)
        {
            if (isRestored)
            {
                this.radDock1.LoadFromXml(@"..\..\..\layout.xml");
                isRestored = false;
            }
        }
     
        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (DockWindow tW in this.radDock1.DockWindows.GetWindows(DockState.TabbedDocument))
            {
                tW.CloseAction = DockWindowCloseAction.Hide;
            }
        }
     
        private void radDock1_DockStateChanging(object sender, DockStateChangingEventArgs e)
        {
            if (e.NewWindow is DocumentWindow)
            {
                if (e.NewDockState == DockState.Hidden)
                {
                    this.radDock1.SaveToXml(@"..\..\..\layout.xml");
                }
                else if (e.NewDockState == DockState.TabbedDocument && e.NewWindow.DockState == DockState.Hidden)
                {
                    isRestored = true;
                }
            }
        }
     
        private void radButton1_Click(object sender, EventArgs e)
        {
            DockWindow[] hiddenWindows = this.radDock1.DockWindows.GetWindows(DockState.Hidden);
            foreach (DockWindow window in hiddenWindows)
            {
                window.Show();
            }
        }
    }

    As another approach I can also suggest using the AddDocument method and specify a DockPosition for each DockWindow that you want to show back.

    I hope this information is useful. Should you have further questions please do not hesitate to write back.

    Regards,
    Hristo Merdjanov
    Telerik
     

    Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.

     
Back to Top