diff --git a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutRoot.cs b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutRoot.cs index d55bf630..019fd9ce 100644 --- a/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutRoot.cs +++ b/ExtendedWPFToolkitSolution/Src/Xceed.Wpf.AvalonDock/Layout/LayoutRoot.cs @@ -678,62 +678,65 @@ namespace Xceed.Wpf.AvalonDock.Layout return; } - var layoutPanelElements = ReadRootPanel( reader ); - if( layoutPanelElements != null ) - { - //Create the RootPanel with the first child - RootPanel = new LayoutPanel( layoutPanelElements.First() ); - //Add all children to RootPanel - for( int i = 1; i < layoutPanelElements.Count; ++i ) - { - RootPanel.Children.Add( layoutPanelElements[ i ] ); - } - } + RootPanel = ReadRootPanel( reader ); TopSide = ( LayoutAnchorSide )ReadElement( reader ); if( TopSide != null ) { - TopSide.Children.Add( ( LayoutAnchorGroup )ReadElement( reader ) ); + foreach(var g in ReadElements(reader)) + TopSide.Children.Add( g ); reader.Read(); + } else { + TopSide = new LayoutAnchorSide(); } + RightSide = ( LayoutAnchorSide )ReadElement( reader ); if( RightSide != null ) { - RightSide.Children.Add( ( LayoutAnchorGroup )ReadElement( reader ) ); + foreach(var g in ReadElements(reader)) + RightSide.Children.Add( g ); reader.Read(); + } else { + RightSide = new LayoutAnchorSide(); } + LeftSide = ( LayoutAnchorSide )ReadElement( reader ); if( LeftSide != null ) { - LeftSide.Children.Add( ( LayoutAnchorGroup )ReadElement( reader ) ); + foreach(var g in ReadElements(reader)) + LeftSide.Children.Add( g ); reader.Read(); + } else { + LeftSide = new LayoutAnchorSide(); } + BottomSide = ( LayoutAnchorSide )ReadElement( reader ); if( BottomSide != null ) { - BottomSide.Children.Add( ( LayoutAnchorGroup )ReadElement( reader ) ); + foreach(var g in ReadElements(reader)) + BottomSide.Children.Add( g ); reader.Read(); + } else { + BottomSide = new LayoutAnchorSide(); } FloatingWindows.Clear(); - var floatingWindows = ReadElementList( reader ); + var floatingWindows = ReadElementList( reader ); foreach( var floatingWindow in floatingWindows ) { - FloatingWindows.Add( ( LayoutFloatingWindow )floatingWindow ); + FloatingWindows.Add( floatingWindow ); } Hidden.Clear(); - var hidden = ReadElementList( reader ); + var hidden = ReadElementList( reader ); foreach( var hiddenObject in hidden ) { - Hidden.Add( ( LayoutAnchorable )hiddenObject ); + Hidden.Add( hiddenObject ); } } - private List ReadRootPanel( XmlReader reader ) + private LayoutPanel ReadRootPanel( XmlReader reader ) { - var result = new List(); - var startElementName = reader.LocalName; reader.Read(); if( reader.LocalName.Equals(startElementName) && (reader.NodeType == XmlNodeType.EndElement) ) @@ -746,33 +749,36 @@ namespace Xceed.Wpf.AvalonDock.Layout reader.Read(); } + LayoutPanel rootPanel = null; if( reader.LocalName.Equals("RootPanel")) { - reader.Read(); + rootPanel = ReadElement( reader ) as LayoutPanel; + } else { + reader.ReadInnerXml(); + } - while( true ) - { - //Read all RootPanel children - var element = ReadElement( reader ) as ILayoutPanelElement; - if( element != null ) - { - result.Add( element ); - } - else if( reader.NodeType == XmlNodeType.EndElement ) - { - break; - } + return rootPanel; + } + + private List ReadElements(XmlReader reader) where T : class + { + var resultList = new List(); + + while(true) { + var result = ReadElement(reader) as T; + if(result == null) { + break; } - } - reader.ReadEndElement(); + resultList.Add(result); + } - return result; + return resultList; } - private List ReadElementList( XmlReader reader ) + private List ReadElementList( XmlReader reader ) where T: class { - var resultList = new List(); + var resultList = new List(); if( reader.IsEmptyElement ) { @@ -784,7 +790,7 @@ namespace Xceed.Wpf.AvalonDock.Layout reader.Read(); if( reader.LocalName.Equals(startElementName) && (reader.NodeType == XmlNodeType.EndElement) ) { - return null; + return resultList; } while( reader.NodeType == XmlNodeType.Whitespace ) @@ -792,16 +798,7 @@ namespace Xceed.Wpf.AvalonDock.Layout reader.Read(); } - while( true ) - { - var result = ReadElement( reader ) as LayoutFloatingWindow; - if( result == null ) - { - break; - } - - resultList.Add( result ); - } + resultList = ReadElements(reader); reader.ReadEndElement(); @@ -823,6 +820,9 @@ namespace Xceed.Wpf.AvalonDock.Layout XmlSerializer serializer; switch( reader.LocalName ) { + case "RootPanel": + serializer = new XmlSerializer( typeof( LayoutPanel ), new XmlRootAttribute("RootPanel") ); + break; case "LayoutAnchorablePaneGroup": serializer = new XmlSerializer( typeof( LayoutAnchorablePaneGroup ) ); break;