2013-10-05 54 views
3

我刚刚开始使用AvalonDock,我一直在墙上敲打我的头几天。我正在尝试从反序列化的dockmanager中加载我的布局的普通任务。我曾尝试过这篇文章提出的(“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

我也碰到过这个问题,这个问题是不是回调。这是没有必要的。在发生Window_Loaded事件之前,反序列化的方法将不起作用。如果之前像在这种情况下在窗口构造函数中调用它,则该对象未完全加载,因此无法正确加载xml。这样做会导致白屏问题。

我从Syncfusion Docking Manager切换到Exceed Avalon Dock时遇到此错误。我只是改变了加载和保存的代码,而不是它们被调用的地方。 Syncfusion Dock Manager加载DOES在调用构造函数时工作,而这个显然不适用于此。没什么大不了的,Window_Loaded做这项工作。

+0

我从超越阿瓦隆码头切换到独立时所面临的同样的问题版本的AvalonDock 2.0.2000。在Window_Loaded中移动Deserialize方法对我很有用。 –

4

我之所以不能够Deserialize我的布局是因为我在我的LoadLayout方法中缺少Serializer.LayoutSerializationCallback事件。

新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事件一起使用。 更好的一点是从屏幕继承你的viewmodel并重写OnViewLoaded(对象视图)方法。在你的视图的xaml中给你的dockmanager一个x:Name,以便你可以在OnViewLoaded方法中使用它。

像这样(与TRAE Moore的代码里贝里的组合):

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