3

저는 AvalonDock을 시작하면서 며칠 동안 벽에 머리를 때리고 있습니다. 직렬화되지 않은 도킹 관리자에서 레이아웃을로드하는 평범한 작업을 수행하려고합니다. 나는 ("AvalonDock DockingManager does not load layout")이 게시물이 제안하고 여전히 빈 화면을 얻는 것을 시도했다.AvalonDock 기본 레이아웃 직렬화 및 비 직렬화를 사용하는 경우 렌더링되지 않음

내 WPF 응용 프로그램의 XAML은 다음과 같습니다 :

<Window x:Name="frm_Main" x:Class="DataCAD.Forms.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:aD="http://schemas.xceed.com/wpf/xaml/avalondock" 
    Title="MainWindow" Height="563.9" Width="832" WindowState="Maximized"> 
<Grid Margin="0,0,0,0"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition/> 
     <ColumnDefinition Width="0*"/> 
    </Grid.ColumnDefinitions> 
    <Menu HorizontalAlignment="Left" Height="24" VerticalAlignment="Top" Width="{Binding ElementName=frm_Main,Path=ActualWidth}"> 
     <MenuItem Name="MnuI_File" Height="21" Width="35" HeaderStringFormat="" Header="File" > 
      <MenuItem Name="mnuFile_Importcui" Padding="15,3,3,3" Header="Import Cuix" Click="MnuFile_Importcui_OnClick"> 
       <MenuItem.Icon> 
        <Image Width="24" Height="24" Source="/Images/cuiImport.png"/> 
       </MenuItem.Icon> 
      </MenuItem> 
      <MenuItem Name="mnuFile_Exportcui" Padding="15,3,3,3" Header="Export Cuix" Click="MnuFile_Exportcui_OnClick"> 
       <MenuItem.Icon> 
        <Image Width="24" Height="24" Source="/Images/cuiExport.png"/> 
       </MenuItem.Icon> 
      </MenuItem> 
      <Separator /> 
      <MenuItem Name="mnuFile_Exit" Padding="15,3,3,3" Header="Exit" Click="MnuFile_Exit_OnClick"/> 
     </MenuItem> 
     <MenuItem Name="MnuI_Edit" Height="21" Width="35" HeaderStringFormat="" Header="Edit" ></MenuItem> 
     <MenuItem Name="MnuI_View" Height="21" Width="42" HeaderStringFormat="" Header="View" > 
      <MenuItem Name="mnuView_Cuixexplorer" IsChecked="True" IsCheckable="True" Padding="15,3,3,3" Header="Cuix Explorer" Click="MnuView_Cuixexplorer_OnClick"/> 
     </MenuItem> 
    </Menu> 
    <aD:DockingManager x:Name="Dockman" Margin="0,21,1,0"> 
     <aD:DockingManager.Theme> 
      <aD:AeroTheme/> 
     </aD:DockingManager.Theme> 
     <aD:LayoutRoot> 
      <aD:LayoutPanel Orientation="Vertical"> 
       <aD:LayoutPanel Orientation="Horizontal"> 
        <aD:LayoutAnchorablePaneGroup DockWidth="150" Orientation="Vertical"> 
         <aD:LayoutAnchorablePane x:Name="CuixExplorerAnchor" DockWidth="150"> 
          <aD:LayoutAnchorable x:Name="CuixExplorer" ContentId="CuixExplorer" Title="Cuix Explorer"> 
           <TreeView Name="trv_CuixDisplay" AllowDrop="True" Drop="trv_CuiDisplay_onDrop"> 
           </TreeView> 
          </aD:LayoutAnchorable> 
         </aD:LayoutAnchorablePane> 
         <aD:LayoutAnchorablePane x:Name="Gen_PropertiesAnchor" DockWidth="150"> 
          <aD:LayoutAnchorable x:Name="Gen_Properties" ContentId="Properties" Title="Properties"> 
           <Grid x:Name="grid"></Grid> 
          </aD:LayoutAnchorable> 
         </aD:LayoutAnchorablePane> 
        </aD:LayoutAnchorablePaneGroup> 
        <aD:LayoutDocumentPaneGroup Orientation="Vertical" DockWidth="*" x:Name="DocPane"> 
         <aD:LayoutDocumentPane x:Name="DockingMainWindow"> 
          <aD:LayoutDocument ContentId="default" Title="default"> 
           <RichTextBox x:Name="DefaultTextBox"></RichTextBox> 
          </aD:LayoutDocument> 
         </aD:LayoutDocumentPane> 
        </aD:LayoutDocumentPaneGroup> 
       </aD:LayoutPanel> 
       <aD:LayoutAnchorablePaneGroup Orientation="Vertical" DockHeight="150" > 
        <aD:LayoutAnchorablePane DockHeight="150" > 
         <aD:LayoutAnchorable ContentId="output" Title="Output"> 
          <TextBox x:Name="OutpuTextBox"></TextBox> 
         </aD:LayoutAnchorable> 
        </aD:LayoutAnchorablePane> 
       </aD:LayoutAnchorablePaneGroup> 
      </aD:LayoutPanel> 
     </aD:LayoutRoot> 
    </aD:DockingManager> 
</Grid> 

내 설정 XML은 다음과 같습니다 :

<?xml version="1.0" encoding="utf-8"?> 
    <LayoutRoot xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <RootPanel Orientation="Vertical"> 
    <LayoutPanel Orientation="Horizontal"> 
     <LayoutAnchorablePaneGroup Orientation="Vertical" DockWidth="150"> 
     <LayoutAnchorablePane DockWidth="150"> 
      <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="Cuix Explorer" IsSelected="True" ContentId="CuixExplorer" /> 
     </LayoutAnchorablePane> 
     <LayoutAnchorablePane DockWidth="150"> 
      <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="Properties" IsSelected="True" ContentId="Properties" /> 
     </LayoutAnchorablePane> 
     </LayoutAnchorablePaneGroup> 
     <LayoutDocumentPaneGroup Orientation="Vertical"> 
     <LayoutDocumentPane> 
      <LayoutDocument Title="default" IsSelected="True" IsLastFocusedDocument="True" ContentId="default" LastActivationTimeStamp="10/05/2013 00:30:01" /> 
     </LayoutDocumentPane> 
     </LayoutDocumentPaneGroup> 
    </LayoutPanel> 
    <LayoutAnchorablePaneGroup Orientation="Vertical" DockHeight="150"> 
     <LayoutAnchorablePane DockHeight="150"> 
     <LayoutAnchorable AutoHideMinWidth="100" AutoHideMinHeight="100" Title="Output" IsSelected="True" ContentId="output" /> 
     </LayoutAnchorablePane> 
    </LayoutAnchorablePaneGroup> 
    </RootPanel> 
    <TopSide /> 
    <RightSide /> 
    <LeftSide /> 
    <BottomSide /> 
    <FloatingWindows /> 
    <Hidden /> 
</LayoutRoot> 

내 코드는 다음과 같습니다 :

public MainWindow() 
{ 
    InitializeComponent(); 
    LoadLayout(); 
    Left = Settings.Default.MAINWINDOW_LEFT; 
    Top = Settings.Default.MAINWINDOW_TOP; 
    Width = Settings.Default.MAINWINDOW_WIDTH; 
    Height = Settings.Default.MAINWINDOW_HEIGHT; 
    WindowState = (Settings.Default.MAINWINDOW_ISMAXIMIZED) ? WindowState.Maximized : WindowState.Normal; 
} 


private void MainWindow_OnClosing(object sender , CancelEventArgs cancelEventArgs) 
{ 

    Settings.Default.MAINWINDOW_LEFT = Left; 
    Settings.Default.MAINWINDOW_TOP = Top; 
    Settings.Default.MAINWINDOW_WIDTH = Width; 
    Settings.Default.MAINWINDOW_HEIGHT = Height; 
    Settings.Default.MAINWINDOW_ISMAXIMIZED = (WindowState == WindowState.Maximized); 
    Settings.Default.CUIXEXPLORER_ISVISIBLE = CuixExplorer.IsVisible; 
    Settings.Default.CUIXEXPLORER_DOCKLOCATION = CuixExplorer.PreviousContainerIndex; 
    Settings.Default.CUIXEXPLORER_WIDTH = CuixExplorer.FloatingWidth; 
    Settings.Default.CUIXEXPLORER_HEIGHT = CuixExplorer.FloatingHeight; 
    Settings.Default.Save(); 
    SaveLayout(); 
} 

private void SaveLayout() 
{ 
    var serializer = new XmlLayoutSerializer(Dockman); 

    using (var stream = new StreamWriter(_settingsFile)) 
    { 
     serializer.Serialize(stream); 
    } 
} 

private void LoadLayout() 
{ 
    var serializer = new XmlLayoutSerializer(Dockman); 
    using (var stream = new StreamReader(_settingsFile)) 
    { 
     serializer.Deserialize(stream); 
    } 
} 

어떤 도움이다 대단히 감사합니다. 미리 감사드립니다.

+0

프랑크의 대답이 표시되어야 @ '최고'... 독립에 아발론 독 초과로 전환 할 때 나는 같은 문제에 직면 – Mikant

답변

3

나는이 문제를 건너하고 문제가 콜백하지 않습니다. 불필요합니다. Deserialize하는 메서드는 Window_Loaded 이벤트가 발생하기 전에는 작동하지 않습니다. 이 경우 윈도우 생성자에서와 같이 전에 호출하면 객체가 완전히로드되지 않으므로 XML을 제대로로드 할 수 없습니다. 이렇게하면 흰색 화면 문제가 발생할 수 있습니다.

Syncfusion Docking Manager에서 Exceed Avalon Dock으로 전환하는 동안이 오류가 발생했습니다. 나는 로딩과 저장만을위한 코드를 바꾸고 있었는데 어디서부터 호출 할까? Syncfusion 독 관리자를로드하면 생성자가 호출 될 때 작동하지만이 함수는 분명히 작동하지 않습니다. 별거 아니, Window_Loaded 일을.

+0

버전의 AvalonDock 2.0.2000. Window_Loaded 내에서 Deserialize 메서드를 이동하면 저에게 효과적입니다. –

4

내 메서드에서 Serializer.LayoutSerializationCallback 이벤트가 누락 되었기 때문에 Deserialize 내 레이아웃이 가능하지 않은 이유가있었습니다.

새로운 LoadLayout 방법 :

public void LoadLayout() 
{ 
    var serializer = new XmlLayoutSerializer(DockingManagerMain); 

    // Imparitive for Deserialization 
    serializer.LayoutSerializationCallback += (s, args) => 
    { 
     args.Content = args.Content; 
    }; 

    serializer.Deserialize(DockingLayoutConfig); 
} 
0

Franck의 솔루션이 코드 숨김의 UserControl_Loaded 이벤트와 함께 작동합니다. 더 좋은 방법은 Screen에서 ViewModel을 상속하고 OnViewLoaded (객체보기) 메서드를 재정의하는 것입니다. xam : Name을 OnViewLoaded 메서드에서 사용할 수 있도록 dockmanager에 x : Name을 지정합니다.

이 (Trae 무어의 코드와 프랑크의 조합)와 같은

뭔가 :

protected override void OnViewLoaded(object view) 
{ 
    base.OnViewLoaded(view); 
    MyView v = view as MyView; 
    if (v?.myDockManager != null) { 
     var ser = new XmlLayoutSerializer(v.myDockManager); 
     // ... 
    } 
}