【问题标题】:AvalonDock not Deserializing LayoutRoot orientation correctlyAvalonDock 未正确反序列化 LayoutRoot 方向
【发布时间】:2017-06-05 15:55:14
【问题描述】:

这很令人沮丧,试图弄清楚这是一个错误还是我是个白痴。

使用 AvalonDock 3.3.17121.18230

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

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

似乎无论 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 Orientation="Vertical" 并且总是像 RootPanel Orientation="Horizo​​ntal" 一样加载它

有人可以试试这个来检查我的理智吗,或者如果我要解决这个问题,请告诉我。我只是想保存从 XAML 属性加载的状态,我不得不认为这是一个错误。

这是我的 XAML 的 Grid 控件

<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);
    }
}

【问题讨论】:

    标签: c# wpf avalondock


    【解决方案1】:

    Toolkit v3.4 已经修复了反序列化时的垂直方向。 Toolkit v3.4 于 2017 年 6 月 5 日发布。 我建议你试试看。

    ―――― 通过Xceed Toolkit Plus for WPF获得更多控制、功能、更新和技术支持

    【讨论】:

    • 太奇怪了,我第一次使用 AvalonDocks 是在上个星期四,遇到了这个问题,并且在今天的版本中得到了修复。但是,我认为他们搞砸了,因为它声称 Xceed.Wpf.Toolkit 是一个依赖项,但没有 nuget 包,所以更新只是破坏了代码。
    • 我得到了它的工作,虽然我必须手动添加“Extended.Wpf.Toolkit”的nuget包。更新后的 AvalonDock nuget 包将其列为依赖项,但并未将其引入。
    猜你喜欢
    • 2022-01-02
    • 2022-01-10
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多