2017-06-05 82 views
0

这很令人沮丧,试图找出这是一个错误还是我是个白痴。AvalonDock没有反序列化LayoutRoot方向

使用AvalonDock 3.3.17121.18230

我有上,下,左/中/右面板的一个简单的布局。在使用XAML中指定的面板属性进行初始加载时,一切都很好。在使用XmlLayoutSerializer的.Serialize保存布局之后,文本文件中的所有内容都看起来很好。但是,使用反序列化重新加载布局时,布局加载不正确,并将顶部和底部面板放置在中央左/中/右面板的左侧和右侧。

我的布局是一个LayoutPanel,其中Orientation =“Vertical”,然后嵌套在3个LayoutPanels中,Orientation =“Horizo​​ntal”。第一个水平面板只是TOP,后面是另一个水平面板,包含3个左/中/右面板,然后是最后的水平面板,即底部面板。

看起来,无论Rootpanels布局方向如何,它总是将其反序列化为水平方向,尽管它明确指出了垂直方向。序列化文件的

Initial load from XAML properties - all ok

内容:

<?xml version="1.0" encoding="utf-8"?> 
<LayoutRoot> 
    <RootPanel Orientation="Vertical"> 
    <LayoutPanel Orientation="Horizontal"> 
     <LayoutAnchorablePane DockHeight="100"> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellTop" IsSelected="True" ContentId="ShellTop" CanClose="False" /> 
     </LayoutAnchorablePane> 
    </LayoutPanel> 
    <LayoutPanel Orientation="Horizontal"> 
     <LayoutAnchorablePane> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellLeft" IsSelected="True" ContentId="ShellLeft" CanClose="False" /> 
     </LayoutAnchorablePane> 
     <LayoutAnchorablePane> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellMain" IsSelected="True" ContentId="ShellMain" CanClose="False" /> 
     </LayoutAnchorablePane> 
     <LayoutAnchorablePane> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellRight" IsSelected="True" ContentId="ShellRight" CanClose="False" /> 
     </LayoutAnchorablePane> 
    </LayoutPanel> 
    <LayoutPanel Orientation="Horizontal"> 
     <LayoutAnchorablePane> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellBottom" IsSelected="True" ContentId="ShellBottom" CanClose="False" /> 
     </LayoutAnchorablePane> 
    </LayoutPanel> 
    </RootPanel> 
    <TopSide /> 
    <RightSide /> 
    <LeftSide /> 
    <BottomSide /> 
    <FloatingWindows /> 
    <Hidden /> 
</LayoutRoot> 

After serializing, then deserializing - not ok

内容序列化文件的保存破布局后:

<?xml version="1.0" encoding="utf-8"?> 
<LayoutRoot> 
    <RootPanel Orientation="Horizontal"> 
    <LayoutPanel Orientation="Horizontal"> 
     <LayoutAnchorablePane DockHeight="100"> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellTop" IsSelected="True" ContentId="ShellTop" CanClose="False" /> 
     </LayoutAnchorablePane> 
    </LayoutPanel> 
    <LayoutPanel Orientation="Horizontal"> 
     <LayoutAnchorablePane> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellLeft" IsSelected="True" ContentId="ShellLeft" CanClose="False" /> 
     </LayoutAnchorablePane> 
     <LayoutAnchorablePane> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellMain" IsSelected="True" ContentId="ShellMain" CanClose="False" /> 
     </LayoutAnchorablePane> 
     <LayoutAnchorablePane> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellRight" IsSelected="True" ContentId="ShellRight" CanClose="False" /> 
     </LayoutAnchorablePane> 
    </LayoutPanel> 
    <LayoutPanel Orientation="Horizontal"> 
     <LayoutAnchorablePane> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="ShellBottom" IsSelected="True" ContentId="ShellBottom" CanClose="False" /> 
     </LayoutAnchorablePane> 
    </LayoutPanel> 
    </RootPanel> 
    <TopSide /> 
    <RightSide /> 
    <LeftSide /> 
    <BottomSide /> 
    <FloatingWindows /> 
    <Hidden /> 
</LayoutRoot> 

正如你所看到的,它像反序列化方法并不在意该RootPanel方向=“垂直”,并始终加载它,就像它是RootPanel方向=“水平”

有人可以请尝试这个来理智检查我,或者如果我要解决这个错误让我知道。我只是试图保存从XAML属性加载的状态,我不得不认为这是一个错误。

这里是我的XAML的电网控制

<Grid> 

     <Grid.RowDefinitions> 
      <RowDefinition Height="20"/> 
      <RowDefinition Height="20"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="1*"></ColumnDefinition> 
      <ColumnDefinition Width="1*"></ColumnDefinition> 
     </Grid.ColumnDefinitions> 

     <Button Grid.Row="0" Grid.Column="0" Content="Save Layout" Click="SaveButton_Click"/> 
     <Button Grid.Row="0" Grid.Column="1" Content="Restore Layout" Click="RestoreButton_Click"/> 
     <Button Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Content="Default Layout" Click="DefaultButton_Click"/> 


     <avalonDock:DockingManager AllowMixedOrientation="True" x:Name="DManager" Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="2" Loaded="dockManager_Loaded"> 
      <avalonDock:LayoutRoot> 

       <avalonDock:LayoutPanel Orientation="Vertical"> 

        <avalonDock:LayoutPanel Orientation="Horizontal"> 

         <avalonDock:LayoutAnchorablePane DockHeight="100"> 
         <avalonDock:LayoutAnchorable Title="ShellTop" ContentId="ShellTop"> 
          <Button Content="TOP"/> 
         </avalonDock:LayoutAnchorable> 
        </avalonDock:LayoutAnchorablePane> 

        </avalonDock:LayoutPanel> 



        <avalonDock:LayoutPanel Orientation="Horizontal"> 

         <avalonDock:LayoutAnchorablePane> 
          <avalonDock:LayoutAnchorable Title="ShellLeft" ContentId="ShellLeft"> 
           <Button Content="LEFT"/> 
          </avalonDock:LayoutAnchorable> 
        </avalonDock:LayoutAnchorablePane> 

        <avalonDock:LayoutAnchorablePane> 
          <avalonDock:LayoutAnchorable Title="ShellMain" ContentId="ShellMain"> 
           <Button Content="MIDDLE"/> 
          </avalonDock:LayoutAnchorable> 
        </avalonDock:LayoutAnchorablePane> 

         <avalonDock:LayoutAnchorablePane> 
          <avalonDock:LayoutAnchorable Title="ShellRight" ContentId="ShellRight"> 
           <Button Content="RIGHT"/> 
          </avalonDock:LayoutAnchorable> 
         </avalonDock:LayoutAnchorablePane> 

        </avalonDock:LayoutPanel> 


        <avalonDock:LayoutPanel Orientation="Horizontal"> 

          <avalonDock:LayoutAnchorablePane> 
         <avalonDock:LayoutAnchorable Title="ShellBottom" ContentId="ShellBottom"> 
          <Button Content="BOTTOM"/> 
         </avalonDock:LayoutAnchorable> 
        </avalonDock:LayoutAnchorablePane> 

        </avalonDock:LayoutPanel> 



       </avalonDock:LayoutPanel> 


      </avalonDock:LayoutRoot> 
     </avalonDock:DockingManager> 
    </Grid> 

代码隐藏

private void SaveButton_Click(object sender, RoutedEventArgs e) 
{ 
    XmlLayoutSerializer layoutSerializer = new XmlLayoutSerializer(DManager); 
    using (var writer = new StreamWriter("C:/Users/xxx/Desktop/test.txt")) 
    { 
     layoutSerializer.Serialize(writer); 
    } 
} 

private void RestoreButton_Click(object sender, RoutedEventArgs e) 
{ 
    XmlLayoutSerializer layoutSerializer = new XmlLayoutSerializer(DManager); 
    using (var reader = new StreamReader("C:/Users/xxx/Desktop/test.txt")) 
    { 
     layoutSerializer.Deserialize(reader); 
    } 
} 

回答

0

工具包V3.4已经具备了反序列化时垂直方向的修正。工具包v3.4今天提供,2017年6月5日。 我建议你尝试一下。

---- 获取更多的控制,功能,更新与Xceed Toolkit Plus for WPF

+0

那么离奇,我第一次使用AvalonDocks上周四,就遇到了这个问题的技术支持,并且它固定在今天的发布。然而,我认为他们搞砸了,因为它声称Xceed.Wpf.Toolkit是一个依赖项,但没有nuget包,所以更新只是破坏了代码。 – z0nghits

+0

我得到它的工作,虽然我不得不手动添加“Extended.Wpf.Toolkit”nuget包。更新后的AvalonDock nuget软件包将其列为依赖项,但未将其引入。 – z0nghits