Как заполнить приложение AvalonDock 2.0 только с помощью AnchorableWindows - без DocumentPane

Я просто хотел бы заполнить приложение AvalonDock только окнами "Инструмент" без какого-либо документа. Я могу вручную свернуть область панели документов, но если возможно, я бы хотел заполнить эту небольшую область другим закрепляемым окном, чтобы ширина и высота LayoutDocumentPane были равны нулю.

Проблема из предположения фреймворка AvalonDock, что в моем случае появляется хотя бы одна пустая DocumentPane. Даже если документа нет, пустое пространство DocumentPane легко перекрывается или перекрывается другими окнами инструментов рядом с ним. Это делает некоторые окна частично невидимыми или недостаточно заполненными.

То, что я тщетно пытался до сих пор:

  1. Удален тег LayoutDocumentPane из декларации DockManager
  2. Установите DockWidth и DockHeight для LayoutDocumentPane в ноль
  3. Свернуть вручную DocumentPane и сериализовать макет

Любая подсказка будет оценена

3 ответа

Решение

Кажется, нет никакого способа сделать это, кроме как изменить исходный код. В методе CollectGarbage в LayoutRoot.cs я закомментировал следующий код и получил то, что хотел - приложение AvalonDock без какой-либо DocumentPane. Если для этого действительно нет способа, я настоятельно рекомендую автору иметь возможность без изменения исходного кода. Надеюсь, это поможет другим, как я.

                if (emptyPane is LayoutDocumentPane &&
                    this.Descendents().OfType<LayoutDocumentPane>().Count(c => c != emptyPane) == 0)
                    continue;

Я удаляю документы одного DocumentPane после восстановления:

public static void Restore(DockingManager dockingManager, string file)
{
  if (File.Exists(file))
  {
    try
    {
      var serializer = new XmlLayoutSerializer(dockingManager);

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

      serializer.Deserialize(file);

      var laToDelete = Singleton.WindowMain.DocumentPane.Children
        .OfType<LayoutAnchorable>()
        .ToList();
      for (var index = 0; index < laToDelete.Count; index++)
      {
        LayoutAnchorable layoutAnchorable = laToDelete[index];
        Singleton.WindowMain.DocumentPane.Children.Remove(layoutAnchorable);
      }
    }
    catch
    {
      File.Delete(file);
    }

  }
}

Другим решением может быть загрузка макета снова, используя код ниже:

Dispatcher.Invoke(new Action(() =>
{
    LoadPageLayout(page);
}), DispatcherPriority.ContextIdle, null);

private void LoadPageLayout(Dashboard.ViewModel.PageViewModel selectedPage)
{
    var serializer = new Xceed.Wpf.AvalonDock.Layout.Serialization.XmlLayoutSerialize(dockingManager);
    serializer.LayoutSerializationCallback += (s, args) =>
    {
        args.Content = args.Content;
    };

    var layoutToRestore = selectedPage.GetLayout();
    if (!String.IsNullOrEmpty(layoutToRestore))
    {
        // Remove any existing LayoutDocumentPane
        var cleanedLayout = RemoveAllEmptyXmlNodes(layoutToRestore);

        StringReader textReader = new StringReader(cleanedLayout);
        serializer.Deserialize(textReader);
    }
}
Другие вопросы по тегам