不调用LayoutSerializationCallback

时间:2015-07-01 11:10:40

标签: c# avalondock

我正在使用AvalonDock,我会序列化和反序列化我的布局。但是并不总是调用回调(我使用ContentId来创建正确对象的实例)。因此加载不正常。我试图添加一个“try-catch”,但不会抛出异常。

这是我的代码:

`var layoutSerializer = new XmlLayoutSerializer(manager);

  layoutSerializer.LayoutSerializationCallback += (s, e) =>
  {
    MyClass item;
    if (items.TryGetValue(e.Model.ContentId, out item))
    {
      e.Content = item;

      var tool = item as IMyClassToolApp;
      var anchorable = e.Model as LayoutAnchorable;

      var document = item as IMyClassDocumentApp;
      var layoutDocument = e.Model as LayoutDocument;

      if (tool != null && anchorable != null)
      {
        addToolCallback(tool);
        tool.IsVisible = anchorable.IsVisible;
        tool.IsSelected = e.Model.IsSelected;
        return;
      }

      if (document != null && layoutDocument != null)
      {
        addDocumentCallback(document);

        // Nasty hack to get around issue that occurs if documents are loaded from state,
        // and more documents are opened programmatically.
        layoutDocument.GetType().GetProperty("IsLastFocusedDocument").SetValue(layoutDocument, false, null);

        document.IsVisible = true;
        document.IsSelected = layoutDocument.IsSelected;
        return;
      }
    }

    e.Cancel = true;
  };

  try
  {
    layoutSerializer.Deserialize(stream);
  }
  catch
  {
    return false;
  }`

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你确定你的流是O.K吗?例如,如果配置文件不存在,则不会调用LayoutSerializationCallback方法。

private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
    try
    {
        MainWindow.logger.Debug("Entering: {0}", "MainWindow_Loaded");

        string filePath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
            @"Jofta\Analyzer\configs\AvalonDock.config");

        if (!string.IsNullOrEmpty(filePath) && File.Exists(filePath))
        {
            XmlLayoutSerializer serializer = new XmlLayoutSerializer(this.dockingManager);
            serializer.LayoutSerializationCallback += this.Serializer_LayoutSerializationCallback;
            serializer.Deserialize(filePath);
        }

        MainWindow.logger.Debug("Exiting: {0}", "MainWindow_Loaded");
    }
    catch (Exception ex)
    {
        MainWindow.logger.Error("Exception in: {0}", "MainWindow_Loaded");
        MainWindow.logger.Error("Message: {0}", ex.Message);
    }
}



private void Serializer_LayoutSerializationCallback(object sender, LayoutSerializationCallbackEventArgs e)
{
    try
    {
        MainWindow.logger.Debug("Entering: {0}", "serializer_LayoutSerializationCallback");

        if (e.Model.ContentId == ObjectExplorerViewModel.AnchorableContentId)
        {
            e.Content = Workspace.Instance.ObjectExplorer;
            return;
        }

        // ...
        // ...

        MainWindow.logger.Debug("Exiting: {0}", "serializer_LayoutSerializationCallback");
    }
    catch (Exception ex)
    {
        MainWindow.logger.Error("Exception in: {0}", "serializer_LayoutSerializationCallback");
        MainWindow.logger.Error("Message: {0}", ex.Message);
    }
}