如何仅使用AnchorableWindows填充AvalonDock 2.0应用程序 - 没有DocumentPane

时间:2013-09-04 01:06:28

标签: c# wpf avalondock

我只想用“工具”窗口填充AvalonDock应用程序而不需要任何文档。我可以手动最小化文档窗格区域,但如果可能的话,我想用另一个可锚定的窗口填充该小区域,以便LayoutDocumentPane的宽度和高度为零。

AvalonDock框架假设在我的案例中至少有一个空的DocumentPane变得明显。即使没有文档,DocumentPane的空间也很容易被其附近的其他工具窗口重叠或重叠。这使得某些窗口部分不可见或填充不足。

到目前为止我徒劳无功的尝试了:

  1. 从DockManager declaratrion
  2. 中删除了LayoutDocumentPane标记
  3. 将LayoutDocumentPane的DockWidth和DockHeight设置为零
  4. 手动最小化DocumentPane并序列化布局
  5. 任何线索将不胜感激

3 个答案:

答案 0 :(得分:1)

还原后,我删除了一个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);
    }

  }
}

答案 1 :(得分:0)

除了更改源代码之外,似乎没有办法做到这一点。在LayoutRoot.cs的CollectGarbage方法中,我注释掉了下面的代码并获得了我想要的东西 - 没有任何DocumentPane的AvalonDock应用程序。如果确实没有这方法,我强烈建议作者可以选择不修改源代码。希望它能帮助像我这样的人。

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

答案 2 :(得分:0)

另一种解决方案是使用以下代码再次加载布局:

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);
    }
}