2013-10-05 57 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); 
     // ... 
    } 
}