Click here to Skip to main content
15,892,059 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hello,

I am not able to load a previous saved layout. Could someone help me? Bellow my problem description and a sample project.

GOAL:

1.I want to be able to move, dock and persist "Charts" positions in "Pages".
2.I want to add and remove "Chart" to a selected "Page".

PROBLEM:

1.Unable to load the persisted chart layout.

IMPLEMENTATION:

1.My xaml contains only one LayoutAnchorablePane:

XML
<avalonDock:DockingManager Grid.Row="1"  x:Name="dockingManager" AnchorablesSource="{Binding SelectedPage.Charts}"
                                   ActiveContent="{Binding SelectedPage.SelectedChart, Mode=TwoWay}" Loaded="dockingManager_Loaded_1" Unloaded="dockingManager_Unloaded_1">
    <avalonDock:DockingManager.Theme>
        <avalonDock:AeroTheme />
    </avalonDock:DockingManager.Theme>
    <avalonDock:DockingManager.LayoutUpdateStrategy>
        <local:LayoutUpdateStrategy />
    </avalonDock:DockingManager.LayoutUpdateStrategy>
    <avalonDock:LayoutRoot >
        <avalonDock:LayoutPanel Orientation="Horizontal">
            <avalonDock:LayoutAnchorablePane x:Name="layoutAnchorablePane">

            </avalonDock:LayoutAnchorablePane>
        </avalonDock:LayoutPanel>
    </avalonDock:LayoutRoot>
    <avalonDock:DockingManager.LayoutItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Title}"></TextBlock>
        </DataTemplate>
    </avalonDock:DockingManager.LayoutItemTemplate>
</avalonDock:DockingManager>



2.I implemented ILayoutUpdateStrategy to add LayoutAnchorable items (my Charts) to the LayoutAnchorablePane and to set LayoutAnchorable items ContentId

C#
public bool BeforeInsertAnchorable(LayoutRoot layout, LayoutAnchorable anchorableToShow, ILayoutContainer destinationContainer)
{
    var pane = layout.Descendents().OfType<LayoutAnchorablePane>().FirstOrDefault();
    if (pane != null)
    {
        anchorableToShow.ContentId = ((Chart)anchorableToShow.Content).ContentId;
        pane.Children.Add(anchorableToShow);
        return true;
    }
    return false;
}


3.I persist the layout through XmlLayoutSerializer when loading the dockingManager or when changing selected Page

private void LoadPageLayout(AvalonDock_Persistence_with_dynamic_layout.ViewModel.Page selectedPage)
{
    if (this.dockingManager == null)
    {
        return;
    }
    XmlLayoutSerializer layoutSerialiser = new XmlLayoutSerializer(this.dockingManager);
    string layoutToRestore = selectedPage.SerializedLayout;
    if (!String.IsNullOrEmpty(layoutToRestore))
    {
        StringReader textReader = new StringReader(layoutToRestore);
        layoutSerialiser.Deserialize(textReader);
    }
}
private void SavePageLayout(AvalonDock_Persistence_with_dynamic_layout.ViewModel.Page selectedPage)
{
    XmlLayoutSerializer layoutSerialiser = new XmlLayoutSerializer(dockingManager);
    StringWriter textWriter = new StringWriter();
    layoutSerialiser.Serialize(textWriter);
    selectedPage.SerializedLayout = textWriter.ToString();
}
private void ListBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
    if (e.RemovedItems.Count > 0)
    {
        var previousSelection = (AvalonDock_Persistence_with_dynamic_layout.ViewModel.Page)e.RemovedItems[0];
        SavePageLayout(previousSelection);
    }
    var currentSelection = (AvalonDock_Persistence_with_dynamic_layout.ViewModel.Page)e.AddedItems[0];
    LoadPageLayout(currentSelection);
}
private void dockingManager_Loaded_1(object sender, RoutedEventArgs e)
{
    var currentSelection = ((MainViewModel)DataContext).SelectedPage;
    LoadPageLayout(currentSelection);
}


4. A sample project can be found on: http://www.sendspace.com/file/07ws19
Posted

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900