Я оцениваю AvalonDock на пригодность для нового проекта и реализовал пример, показанный в документации класса LayoutRoot.Я добавил методы для сохранения и восстановления макета при выключении и запуске.Как видно на изображениях ниже, макет восстанавливается должным образом, но после перезагрузки макета из файла PropertyGrid больше не отображает содержимое из текущего документа.Я подозреваю, что это как-то связано с контентом, поступающим из другого элемента в XAML, но не могу понять, как заставить его правильно отображаться после перезагрузки макета.Я пытался вручную вызывать PropertyGrid.Update () в разное время после перезагрузки макета без какого-либо успеха.Может кто-нибудь объяснить, почему это работает не так, как я ожидал, и как заставить его работать, если это возможно?
Изображение 1: PropertyGrid показывает свойства кнопки в Документе 1 перед сохранением.
Изображение 2: PropertyGrid НЕ показывает свойства кнопки в Документе 1 после перезагрузки сохраненного макета.
XAML из примера:
<xcad:LayoutRoot x:Name="_layoutRoot" >
<xcad:LayoutPanel Orientation="Horizontal">
<xcad:LayoutAnchorablePane DockWidth="200">
<xcad:LayoutAnchorable ContentId="properties" Title="Properties" CanHide="False" CanClose="False"
AutoHideWidth="240" >
<!--IconSource="Images/property-blue.png"-->
<xctk:PropertyGrid NameColumnWidth="110" Name="pg"
SelectedObject="{Binding ElementName=_layoutRoot, Path=LastFocusedDocument.Content}" />
</xcad:LayoutAnchorable>
</xcad:LayoutAnchorablePane>
<xcad:LayoutDocumentPaneGroup >
<xcad:LayoutDocumentPane>
<xcad:LayoutDocument ContentId="document1" Title="Document 1" IconSource="Images/document.png" >
<Button Content="Document 1 Content" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</xcad:LayoutDocument>
<xcad:LayoutDocument ContentId="document2" Title="Document 2" IconSource="Images/document.png">
<TextBox Text="Document 2 Content" AcceptsReturn="True"/>
</xcad:LayoutDocument>
</xcad:LayoutDocumentPane>
</xcad:LayoutDocumentPaneGroup >
<xcad:LayoutAnchorablePaneGroup DockWidth="125">
<xcad:LayoutAnchorablePane>
<xcad:LayoutAnchorable ContentId="alarms" Title="Alarms" >
<!--IconSource="../Images/alarm-clock-blue.png"-->
<ListBox>
<s:String>Alarm 1</s:String>
<s:String>Alarm 2</s:String>
<s:String>Alarm 3</s:String>
</ListBox>
</xcad:LayoutAnchorable>
<xcad:LayoutAnchorable ContentId="journal" Title="Journal" >
<RichTextBox>
<FlowDocument>
<Paragraph FontSize="14" FontFamily="Segoe">
This is the content of the Journal Pane.
<LineBreak/>
A
<Bold>RichTextBox</Bold> has been added here
</Paragraph>
</FlowDocument>
</RichTextBox>
</xcad:LayoutAnchorable>
</xcad:LayoutAnchorablePane>
</xcad:LayoutAnchorablePaneGroup>
</xcad:LayoutPanel>
<xcad:LayoutRoot.LeftSide>
<xcad:LayoutAnchorSide>
<xcad:LayoutAnchorGroup>
<xcad:LayoutAnchorable Title="Agenda" ContentId="agenda" >
<!--IconSource="../Images/address-book-open.png"-->
<TextBlock Text="Agenda Content" Margin="10" FontSize="18" FontWeight="Black" TextWrapping="Wrap"/>
</xcad:LayoutAnchorable>
<xcad:LayoutAnchorable Title="Contacts" ContentId="contacts" >
<!--IconSource="../Images/address-book-pencil.png"-->
<TextBlock Text="Contacts Content" Margin="10" FontSize="18" FontWeight="Black" TextWrapping="Wrap"/>
</xcad:LayoutAnchorable>
</xcad:LayoutAnchorGroup>
</xcad:LayoutAnchorSide>
</xcad:LayoutRoot.LeftSide>
</xcad:LayoutRoot>
Метод, который перезагружает макет:
private void LoadDockingManagerLayout(DockingManager docManager)
{
string layoutFileName = System.IO.Path.Combine(DirAppData, LayoutFileName);
if (System.IO.File.Exists(layoutFileName) == false)
return;
var layoutSerializer = new XmlLayoutSerializer(docManager);
layoutSerializer.Deserialize(layoutFileName);
}