これはバグか、私はばかだとわかりません。AvalonDockはレイアウトの向きを正しくデシリアライズしません
AvalonDock 3.3.17121.18230を使用
は私は上、下、左/中央/右のパネルのシンプルなレイアウトを持っています。 XAMLで指定されたパネルプロパティで初期ロード中はすべて問題ありません。 XmlLayoutSerializerの.Serializeを使用してレイアウトを保存した後、テキストファイルのすべてが正常に表示されます。ただし、Deserializeを使用してレイアウトを再ロードすると、レイアウトが不適切に読み込まれ、中央のLeft/Center/Rightパネルの左右にTopパネルとBottomパネルが配置されます。
私のレイアウトは、Orientation = "Vertical"のLayoutPanelであり、その中にはOrientation = "Horizontal"の3つのLayoutPanelがあります。最初の水平パネルはTOPだけで、3つ左/中央/右パネル、最後にBOTTOMパネルの水平パネルを含む別の水平パネルが続きます。
RootPanelsのレイアウト方向に関係なく、明示的にverticalと指定されていても、常に水平方向に逆シリアル化されているようです。シリアル化されたファイルの
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 = "Horizontal"
誰かがこれを正気にチェックしてください。私はちょうど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);
}
}
だから、奇妙な、初めてと技術サポートを取得し、それが今日のリリースで修正されています。しかし、Xceed.Wpf.Toolkitは依存関係ですが、Nugetパッケージがないので、更新がコードを壊すだけなので、彼らはうんざりしていると思います。 – z0nghits
"Extended.Wpf.Toolkit"のナゲットパッケージを手動で追加する必要がありましたが、うまくいきました。更新されたAvalonDockのnugetパッケージはそれを依存関係としてリストアップしましたが、それを持ち込んでいませんでした。 – z0nghits