2015-01-27 4 views
3

LayoutDocumentPane이있는 단순한 AvalonDock 응용 프로그램. Program sampleAvalonDock 2.0 : Deserialize 레이아웃 후에 LayoutDocument가 추가되지 않음

XAML :

<Window x:Name="MainWindow1" x:Class="AvalonTest2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock" 
     Title="MainWindow" Height="350" Width="525" Loaded="MainWindow1_Loaded"> 
    <Grid Name="MainGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <ToolBar Grid.Row="0" Grid.Column="0"> 
      <Button Content="New Tab" Margin="10,0,0,0" Click="NewTabClick"/> 
      <Button Content="Save layout" Margin="10,0,0,0" Click="Button_Click"/> 
     </ToolBar> 

     <xcad:DockingManager x:Name="dockManager" Grid.Row="1"> 
      <xcad:LayoutRoot x:Name="_layoutRoot"> 
       <xcad:LayoutPanel Orientation="Horizontal" x:Name="_layoutPanel"> 
        <xcad:LayoutDocumentPane x:Name="workSpace"> 
         <xcad:LayoutDocument ContentId="dummy" Title="Dummy" > 
          <Button x:Name="dummyButton" Content="Dummy Content" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
         </xcad:LayoutDocument> 
        </xcad:LayoutDocumentPane> 
       </xcad:LayoutPanel> 
      </xcad:LayoutRoot> 
     </xcad:DockingManager> 
    </Grid> 
</Window> 

코드 :

using System; 
using System.IO; 
using System.Windows; 
using Xceed.Wpf.AvalonDock.Layout; 
using Xceed.Wpf.AvalonDock.Layout.Serialization; 

namespace AvalonTest2 
{ 
    public partial class MainWindow : Window 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void NewTabClick(object sender, RoutedEventArgs e) 
     { 
      var ld = new LayoutDocument(); 
      var x = new Random().Next().ToString(); 
      ld.Title = x; 
      ld.ContentId = x; 
      workSpace.Children.Add(ld); 
     } 

     private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      var layoutSerial = new XmlLayoutSerializer(dockManager); 
      layoutSerial.Serialize("layout.xml"); 
     } 

     private void MainWindow1_Loaded(object sender, RoutedEventArgs e) 
     { 
      if (File.Exists("layout.xml")) 
      { 
       // var serializer = new XmlLayoutSerializer(dockManager); 
       // serializer.Deserialize("layout.xml"); 
      } 
     } 
    } 
} 

I를 누르면 "새 탭"버튼 모든 것이 괜찮 : 새로운 탭이 나타납니다.

프로그램을 다시 시작하고 레이아웃을 저장하고 ("레이아웃 저장"버튼), 프로그램을 닫고 비 직렬화 라인에 주석을 제거합니다.

프로그램을 시작하고 "새 탭"을 누르면 아무 탭도 표시되지 않습니다. LayoutDocumentPane (workSpace) 내부를 볼 것입니다. "Children"속성은 새 Documents로 채워집니다.

무엇이 잘못 되었나요?

답변

2

불행히도 (비) 직렬화 기능은 AvalonDock 제품군에서 그리 좋지 않습니다.

비 직렬화시 완전히 새로운 LayoutRoot 개체가 만들어집니다. XAML에서 workSpace이라는 이름의 LayoutDocumentPane을 정의하고이 창에 새로 만든 LayoutDocument을 추가합니다. 그러나 비 직렬화 후에이 LayoutDocumentPane은 더 이상 레이아웃에 속하지 않습니다. 새 LayoutDocumentPane이 대신 생성되었습니다.

그러므로 개의보기가 workSpace 컨테이너에 추가 된 것을 볼 수 없습니다.

LayoutDocumentPane의 인스턴스를 이름으로 참조하지 말고 대신 동적으로 찾으십시오. 코드를 다음과 같이 변경해야합니다.

var ld = new LayoutDocument(); 
var x = new Random().Next().ToString(); 
ld.Title = x; 
ld.ContentId = x; 

LayoutDocumentPane documentPane = this.dockManager.Layout.Descendents().OfType<LayoutDocumentPane>().SingleOrDefault(); 
if (documentPane != null) 
{ 
    documentPane.Children.Add(ld); 
} 
+0

감사합니다. 나는 우리가 1.x 버전에서 같은 문제가 있다는 것을 알았지 만 잊어 버렸다. :( – Badiboy