Как заполнить приложение AvalonDock 2.0 только с помощью AnchorableWindows - без DocumentPane
Я просто хотел бы заполнить приложение AvalonDock только окнами "Инструмент" без какого-либо документа. Я могу вручную свернуть область панели документов, но если возможно, я бы хотел заполнить эту небольшую область другим закрепляемым окном, чтобы ширина и высота LayoutDocumentPane были равны нулю.
Проблема из предположения фреймворка AvalonDock, что в моем случае появляется хотя бы одна пустая DocumentPane. Даже если документа нет, пустое пространство DocumentPane легко перекрывается или перекрывается другими окнами инструментов рядом с ним. Это делает некоторые окна частично невидимыми или недостаточно заполненными.
То, что я тщетно пытался до сих пор:
- Удален тег LayoutDocumentPane из декларации DockManager
- Установите DockWidth и DockHeight для LayoutDocumentPane в ноль
- Свернуть вручную 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);
}
}