Пример AvalonDock LayoutRoot с перезагруженным макетом из файла не показывает свойства - PullRequest
0 голосов
/ 23 мая 2018

Я оцениваю AvalonDock на пригодность для нового проекта и реализовал пример, показанный в документации класса LayoutRoot.Я добавил методы для сохранения и восстановления макета при выключении и запуске.Как видно на изображениях ниже, макет восстанавливается должным образом, но после перезагрузки макета из файла PropertyGrid больше не отображает содержимое из текущего документа.Я подозреваю, что это как-то связано с контентом, поступающим из другого элемента в XAML, но не могу понять, как заставить его правильно отображаться после перезагрузки макета.Я пытался вручную вызывать PropertyGrid.Update () в разное время после перезагрузки макета без какого-либо успеха.Может кто-нибудь объяснить, почему это работает не так, как я ожидал, и как заставить его работать, если это возможно?

PropertyGrid showing properties of button in Document 1 Изображение 1: PropertyGrid показывает свойства кнопки в Документе 1 перед сохранением.

PropertyGrid NOT showing properties of button in Document 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);
    }

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы должны присоединить LayoutSerializationCallback, созданный вашим экземпляром DockingManager, а затем установить сериализованный Content макета.Как то так:

var layoutSerializer = new XmlLayoutSerializer(this.DockManager);
layoutSerializer.LayoutSerializationCallback += layoutSerializer_LayoutSerializationCallback;

protected virtual void layoutSerializer_LayoutSerializationCallback(object sender, LayoutSerializationCallbackEventArgs e)
{
    try
    {
        var model = this.Docs.Union(this.Tools).FirstOrDefault(vm => vm.ContentId == e.Model.ContentId);
        if (model != null)
        {
            e.Content = model;
        }
        else
        {
            // Log load layout error info                    
        }
    }
    catch (Exception ex)
    {
        // Log load layout error info    
    }
}
0 голосов
/ 24 мая 2018

Оказывается, что перезагруженный макет заменяет макет, созданный при запуске.Так что ссылка на _layoutRoot больше не действительна.Поэтому мне пришлось воссоздать привязку следующим образом:

        Binding myBinding = new Binding("LastFocusedDocument.Content");
        myBinding.Source = docManager.Layout;
        pg.SetBinding(PropertyGrid.SelectedObjectProperty, myBinding);
...