0

I'm using AvalonDock and when closing the app, I save a xml file of the Layout. It works fine as long as my Anchorables are either not visible or docked. If I save a layout with a floating window I get a NullReferenceException

Here is my Xaml:

    <xcad:DockingManager x:Name="DockManager" Grid.Row="1"
                       AllowMixedOrientation="True"
                       BorderBrush="Black"
                       BorderThickness="1"
                      >
        <xcad:DockingManager.DocumentHeaderTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding IconSource}" Margin="0,0,4,0"/>
                    <TextBlock Text="{Binding Title}" />
                </StackPanel>
            </DataTemplate>
        </xcad:DockingManager.DocumentHeaderTemplate>
        <xcad:LayoutRoot x:Name="_layoutRoot">
            <xcad:LayoutPanel Orientation="Horizontal">
                <xcad:LayoutAnchorablePaneGroup x:Name="Container" DockWidth="4*">
                    <xcad:LayoutAnchorablePane x:Name="Filter_Pane" DockWidth="1*">
                        <xcad:LayoutAnchorable x:Name="Filter" Title="Filter" AutoHideWidth="240" AutoHideMinWidth="500" AutoHideMinHeight="200" FloatingHeight="400" FloatingWidth="300" CanFloat="True" FloatingLeft="300" FloatingTop="200" >
                            <Grid x:Name="Filter_Grid" >
                                <Grid.RowDefinitions>
                                    <RowDefinition />
                                    <RowDefinition Height="50"/>
                                </Grid.RowDefinitions>
                                <StackPanel Grid.Row="0" x:Name="StackPanel_Filter" />
                                <StackPanel Orientation="Horizontal" Grid.Row="1" x:Name="Filter_Buttons">
                                    <Button x:Name="Filter_btn_Apply" Content="Apply" Width="60" Height="22" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="5,0,5,5"/>
                                    <Button x:Name="Filter_btn_Clear" Content="Clear" Width="60" Height="22" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="5,0,5,5" Click="Filter_btn_Clear_Click"/>
                                    <Button x:Name="Filter_btn_Close" Content="Close" Width="60" Height="22" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="5,0,5,5" Click="Filter_btn_Close_Click"/>
                                </StackPanel>
                            </Grid>
                        </xcad:LayoutAnchorable>
                    </xcad:LayoutAnchorablePane>
                    <xcad:LayoutAnchorablePane x:Name="DataGrid_Pane" DockWidth="4*" >
                        <xcad:LayoutAnchorable>
                            <DataGrid AutoGenerateColumns="True" x:Name="Datagrid_A" Margin="0,-18,0,0" MinColumnWidth="50" MinRowHeight="15" RowBackground="White" AlternatingRowBackground="#FFF0F0F0" AutoGeneratedColumns="Datagrid_A_AutoGeneratedColumns" ColumnHeaderHeight="30" AreRowDetailsFrozen="True" HorizontalGridLinesBrush="#FFB4B4B4" VerticalGridLinesBrush="#FFB4B4B4" Loaded="Datagrid_A_Loaded">
                                <DataGrid.Resources>
                                    <Style TargetType="DataGridRow">
                                        <EventSetter Event="MouseDoubleClick" Handler="Row_DoubleClick"/>
                                    </Style>
                                    <Style TargetType="DataGridCell">
                                        <Style.Triggers>
                                            <Trigger Property="DataGridCell.IsSelected" Value="True">
                                                <Setter Property="Background" Value="Blue" />
                                            </Trigger>
                                        </Style.Triggers>
                                    </Style>
                                    <Style BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" TargetType="{x:Type DataGridColumnHeader}">
                                        <Setter Property="Background" Value="#FFCDCDD1" />
                                        <Setter Property="BorderBrush" Value="#FFB4B4B4"/>
                                        <Setter Property="BorderThickness" Value="0,0,1,0"/>
                                        <Setter Property="FontWeight" Value="Bold"/>
                                        <Setter Property="HorizontalAlignment" Value="Stretch"/>

                                    </Style>
                                </DataGrid.Resources>

                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="" Width="*"></DataGridTextColumn>
                                </DataGrid.Columns>
                            </DataGrid>

                        </xcad:LayoutAnchorable>
                    </xcad:LayoutAnchorablePane>
                </xcad:LayoutAnchorablePaneGroup>
                <xcad:LayoutAnchorablePaneGroup x:Name="Hidden_Windows" DockWidth="1*" >
                    <xcad:LayoutAnchorablePane x:Name="Pane_Edit">
                        <xcad:LayoutAnchorable x:Name="Edit" Title="Edit" FloatingHeight="300" FloatingWidth="445" FloatingLeft="1000" FloatingTop="500">
                            <Grid x:Name="Edit_Grid" >
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="Auto"/>
                                    <RowDefinition Height="*"/>
                                </Grid.RowDefinitions>

                                <StackPanel x:Name="StackPanel_Edit" Grid.Row="0" />
                                <StackPanel x:Name="Edit_Buttons" Orientation="Horizontal" Grid.Row="1" Height="35" VerticalAlignment="Bottom">
                                    <Button Content="Close" Click="Button_Click_1" Width="75" Height="30" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="5,0,5,5"/>
                                    <Button Content="&lt;-" HorizontalAlignment="Center" VerticalAlignment="Bottom" Height="30" Width="30" Click="Button_Click_4" Margin="5,0,5,5"/>
                                    <Button Content="-&gt;" HorizontalAlignment="Center" VerticalAlignment="Bottom" Height="30" Width="30" Click="Button_Click_5" Margin="5,0,5,5"/>
                                    <Button x:Name="Btn_Edit_Save" Margin="5,-3,5,5" HorizontalAlignment="Center" Width="75" Height="30" VerticalAlignment="Bottom">
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Height="21"><Run Text="Save"/></TextBlock>
                                            <Image Source="/resources/save.png" Height="24" Width="25"/>
                                        </StackPanel>
                                    </Button>
                                    <Button x:Name="btn_Edit_Add" HorizontalAlignment="Center" Margin="5,0,5,5" VerticalAlignment="Bottom" Width="75" Height="30" Click="Button_Add_Click">
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Width="24"><Run Text="Add"/></TextBlock>
                                            <Image Source="/resources/Add.png" Height="20" Width="20"/>
                                        </StackPanel>
                                    </Button>
                                    <Button x:Name="btn_Edit_Delete" Margin="5,0,5,5" Height="30" HorizontalAlignment="Center" Width="75" VerticalAlignment="Bottom">
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Width="38"><Run Text="Delete"/></TextBlock>
                                            <Image Source="/resources/delete.png" Height="20" Width="25"/>
                                        </StackPanel>
                                    </Button>
                                </StackPanel>
                            </Grid>
                        </xcad:LayoutAnchorable>
                    </xcad:LayoutAnchorablePane>
                    <xcad:LayoutAnchorablePane x:Name="Pane_Add">
                        <xcad:LayoutAnchorable x:Name="Add" Title="Add" FloatingHeight="300" FloatingWidth="445" FloatingLeft="1000" FloatingTop="500"   >
                            <Grid x:Name="Add_Grid" Margin="0,1,-1,-2">
                                <StackPanel x:Name="StackPanel_Add" Margin="0,0,0,37"/>
                                <Button Content="Button" Margin="116,0,10,10" Height="22" VerticalAlignment="Bottom" HorizontalAlignment="Center" Width="74"/>
                                <Button x:Name="Btn_Exit_Add" Content="Exit" Margin="10,0,115,10" Height="22" VerticalAlignment="Bottom" Click="Btn_Exit_Add_Click" HorizontalAlignment="Center" Width="75"/>
                            </Grid>
                        </xcad:LayoutAnchorable>
                    </xcad:LayoutAnchorablePane>
                </xcad:LayoutAnchorablePaneGroup>
            </xcad:LayoutPanel>
        </xcad:LayoutRoot>
    </xcad:DockingManager>

this is how I handle the layout save and load:

        //Save windwos' Layout on Close
        private void Window_Closed(object sender, EventArgs e)
        {
             XmlLayoutSerializer layoutSerializer = new 
             XmlLayoutSerializer(DockManager);
            using (var writer = new StreamWriter("WindowLayout.xml")) 
            {
                layoutSerializer.Serialize(writer);
            }
        }

        //Load Window Layout on Load
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

            if (File.Exists("WindowLayout.xml"))
            {
                XmlLayoutSerializer layoutSerializer = new XmlLayoutSerializer(DockManager);
                StreamReader reader = new StreamReader("WindowLayout.xml");

                if (reader != null)
                {
                    layoutSerializer.Deserialize(reader);
                }

            }

        }  

And this is the output of the Serialization :

<?xml version="1.0" encoding="utf-8"?>
<LayoutRoot>
  <RootPanel Orientation="Horizontal">
    <LayoutAnchorablePaneGroup Orientation="Horizontal" DockWidth="4*">
      <LayoutAnchorablePane Id="21c8177e-4045-4884-a576-22d096e1e9fa" />
      <LayoutAnchorablePane DockWidth="4*">
        <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" IsSelected="True" ContentId="Datagrid_A" CanClose="False" />
      </LayoutAnchorablePane>
    </LayoutAnchorablePaneGroup>
    <LayoutAnchorablePaneGroup Orientation="Horizontal">
      <LayoutAnchorablePane Id="4fb678e1-2fb1-4041-82ed-7350fb2dea7a" />
      <LayoutAnchorablePane Id="04694aaf-fdb8-4520-ac4c-91cb5f20bd96" />
    </LayoutAnchorablePaneGroup>
  </RootPanel>
  <TopSide />
  <RightSide />
  <LeftSide />
  <BottomSide />
  <FloatingWindows>
    <LayoutAnchorableFloatingWindow>
      <LayoutAnchorablePaneGroup Orientation="Horizontal" FloatingWidth="300" FloatingHeight="400" FloatingLeft="300" FloatingTop="200">
        <LayoutAnchorablePane FloatingWidth="300" FloatingHeight="400" FloatingLeft="300" FloatingTop="200">
          <LayoutAnchorable AutoHideWidth="240" AutoHideMinWidth="500" AutoHideMinHeight="200" Title="Filter" IsSelected="True" ContentId="Filter_Grid" FloatingLeft="300" FloatingTop="200" FloatingWidth="300" FloatingHeight="400" CanClose="False" LastActivationTimeStamp="03/25/2019 11:16:53" PreviousContainerId="21c8177e-4045-4884-a576-22d096e1e9fa" PreviousContainerIndex="0" />
        </LayoutAnchorablePane>
      </LayoutAnchorablePaneGroup>
    </LayoutAnchorableFloatingWindow>
  </FloatingWindows>
  <Hidden>
    <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="Add" ContentId="Add_Grid" FloatingLeft="1000" FloatingTop="500" FloatingWidth="445" FloatingHeight="300" CanClose="False" PreviousContainerId="04694aaf-fdb8-4520-ac4c-91cb5f20bd96" PreviousContainerIndex="0" />
    <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="Edit" ContentId="Edit_Grid" FloatingLeft="1000" FloatingTop="500" FloatingWidth="445" FloatingHeight="300" CanClose="False" PreviousContainerId="4fb678e1-2fb1-4041-82ed-7350fb2dea7a" PreviousContainerIndex="0" />
  </Hidden>
</LayoutRoot>

thank you for your help

Rayounnes
  • 1
  • 1
  • And what does the **stack trace** of the exception say about _where_ it was thrown? – René Vogt Mar 25 '19 at 15:49
  • Stack trace says it's thrown at Xceed.Wpf.AvalonDock.Controls.LayoutAnchorableFloatingWindowControl.OnInitialized(EventArgs e) – Rayounnes Mar 25 '19 at 17:28
  • A similar issue has been [fixed here](https://github.com/Dirkster99/AvalonDock/issues/28) - is your problem still there using this version? If yes can please [report your issue](https://github.com/Dirkster99/AvalonDock) to the project. – user8276908 May 24 '19 at 08:36

0 Answers0