Saving and Loading Window Layout |
You can save the window layout as DockLayout object, then load the layout at a later time.
This topic contains the following sections:
Simply call DockControlSave method to save the current window layout as a DockLayout object. This DockLayout object, can be further persisted as XAML string:
DockLayout layout = dockControl.Save(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.IndentChars = new string(' ', 4); StringBuilder strbuild = new StringBuilder(); XmlWriter xmlWriter = XmlWriter.Create(strbuild, settings); XamlWriter.Save(layout, xmlWriter); Console.WriteLine(strbuild.ToString());
Dim layout As DockLayout = dockControl.Save() Dim settings As New XmlWriterSettings() settings.Indent = True settings.IndentChars = New String(" "c, 4) Dim strbuild As New StringBuilder() Dim xmlWriter As XmlWriter = XmlWriter.Create(strbuild, settings) XamlWriter.Save(layout, xmlWriter) Console.WriteLine(strbuild.ToString())
No code example is currently available or this language may not be supported.
Note |
---|
The XamlWriterSave method requires full trust. If you want to save the XAML in partial trust, you must implement your own XAML writer, as demonstrated in DockSample. |
A sample of persisted XAML string:
<DockLayout xmlns="http://schemas.devzest.com/presentation/docking" xmlns:ns2="clr-namespace:DevZest.DockSample;assembly=DockSample" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" DockTreeZOrder="Right, Left, Top, Bottom"> <DockLayout.DockItems> <DockItemReference>DevZest.DockSample.Output</DockItemReference> <DockItemReference>DevZest.DockSample.SavedState</DockItemReference> <DockItemReference>DevZest.DockSample.PropertiesWindow</DockItemReference> <DockItemReference>DevZest.DockSample.SolutionExplorer</DockItemReference> <DockItemReference>DevZest.DockSample.Welcome</DockItemReference> <DockItemReference> <ns2:Document DocumentId="1" /> </DockItemReference> <DockItemReference> <ns2:Document DocumentId="2" /> </DockItemReference> </DockLayout.DockItems> <DockLayout.ShowActions> <ShowAsDockPositionAction DockPosition="BottomAutoHide" Source="1" /> <ShowAsSidePaneAction Side="Left" Size="*" IsSizeForTarget="True" Target="1" Source="0" /> <ShowAsDockPositionAction DockPosition="Right" Source="2" /> <ShowAsTabbedAction Target="2" Source="3" /> <ShowAsDockPositionAction DockPosition="Document" Source="4" /> <ShowAsTabbedAction Target="4" Source="5" /> <ShowAsTabbedAction Target="4" Source="6" /> </DockLayout.ShowActions> </DockLayout>
Important |
---|
When saving the window layout, an instance of DockItemReference is created for each DockItem, with its Target property set to the object instance returned by DockItemSave method. By default DockItemSave method returns the string of the type when HideOnPerformClose property is true, otherwise returns this DockItem itself. You may override DockItemSave to provide your own implementation. When loading the window layout, you need to provide a callback delegate to convert this saved object back into a DockItem. |
You can call DockControlLoad method to load the previous saved window layout. This method, takes two parameters, one is the previously saved DockLayout, the other is a callback delegate to convert the object instance as DockItemReferenceTarget to DockItem:
private void LoadLayout_Click(object sender, RoutedEventArgs e) { ... CloseAll(); dockControl.Load(layout, LoadDockItem); ... } private void CloseAll() { for (int i = dockControl.DockItems.Count - 1; i >= 0; i--) { DockItem item = dockControl.DockItems[i]; item.Close(); } } private DockItem LoadDockItem(object obj) { if (welcome.GetType().ToString().Equals(obj)) return welcome; else if (savedLayout.GetType().ToString().Equals(obj)) return savedLayout; else if (output.GetType().ToString().Equals(obj)) return output; else if (solutionExplorer.GetType().ToString().Equals(obj)) return solutionExplorer; else if (propertiesWindow.GetType().ToString().Equals(obj)) return propertiesWindow; else return obj as DockItem; }
Private Sub LoadLayout_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) ... CloseAll() dockControl.Load(layout, AddressOf LoadDockItem) ... End Sub Private Sub CloseAll() Dim i As Integer = (dockControl.DockItems.Count - 1) Do While (i >= 0) Dim item As DockItem = dockControl.DockItems(i) item.Close() i = (i - 1) Loop End Sub Private Function LoadDockItem(ByVal obj As Object) As DockItem If welcome.GetType.ToString.Equals(obj) Then Return welcome ElseIf savedLayout.GetType.ToString.Equals(obj) Then Return savedLayout ElseIf output.GetType.ToString.Equals(obj) Then Return output ElseIf solutionExplorer.GetType.ToString.Equals(obj) Then Return solutionExplorer ElseIf propertiesWindow.GetType.ToString.Equals(obj) Then Return propertiesWindow Else Return CType(obj, DockItem) End If End Function
No code example is currently available or this language may not be supported.
Note |
---|
You must close all DockItem before loading the window layout, otherwise an exception will throw. |