Я использую макет загрузки/сохранения, аналогичный описанному в КодПроект. Перехват события LayoutSerializationCallback и попытка найти соответствующий viewModel для LayoutItem
private void LayoutSerializer_LayoutSerializationCallback(object sender, LayoutSerializationCallbackEventArgs e)
{
// This can happen if the previous session was loading a file
// but was unable to initialize the view ...
if (string.IsNullOrWhiteSpace(e.Model.ContentId) || (e.Content = ReloadItem(e.Model)) == null)
{
e.Cancel = true;
return;
}
}
private object ReloadItem(object item)
{
object ret = null;
switch (item)
{
case LayoutAnchorable anchorable:
//list of tools windows
ret = Manager.Tools.FirstOrDefault(i => i.ContentId == anchorable.ContentId);
if(ret == null && anchorable.ContentId.StartsWith(MapPanel.MapPanelPrefix))
{
MapPanels.Add(anchorable);
}
break;
case LayoutDocument document:
// list of restored documents
ret = Manager.Documents.FirstOrDefault(i => i.ContentId == document.ContentId);
break;
default:
throw new NotImplementedException("Not implemented type of AD item ");
}
return ret;
}
Это отлично работает, когда у меня есть все ViewModels, доступные при десериализации/восстановлении макета.
Но я думаю о чем-то вроде отложенного восстановления макета. В моем случае у меня есть некоторые документы и несколько панелей, доступных в начале. Но могут быть некоторые панели (назовем их MapPanel), которые загружаются позже (модели представления загружаются где-то в будущем). И я не могу понять, как восстановить расположение этих панелей.
Для этого случая у меня есть List MapPanels для хранения привязок, которые загружаются при загрузке макета avalondock, и пытаюсь восстановить их в BeforeInsertAnchorable в ILayoutUpdateStrategy. Но когда я отлаживаю его, у сохраненного LayoutAnchorable есть разные родители, которые его сохранили. Поэтому я предполагаю, что после отмены (e.Cancel = true) в LayoutSerializationCallback каким-то образом модифицируется не восстановленная привязка.
public bool BeforeInsertAnchorable(LayoutRoot layout, LayoutAnchorable anchorableToShow, ILayoutContainer destinationContainer)
{
if (anchorableToShow.Content is ToolPanel tool)
{
if(tool is MapPanel)
{
anchorableToShow = LayoutSaveLoadUtil.Instance.MapPanels.FirstOrDefault(mp => mp.ContentId == anchorableToShow.ContentId);
}
var destPane = destinationContainer as LayoutAnchorablePane;
if (destinationContainer != null && destinationContainer.FindParent<LayoutFloatingWindow>() != null)
return false;
var dockLeftPane = layout.Descendents().OfType<LayoutAnchorablePane>().FirstOrDefault(d => d.Name == tool.PreferredLocation + "Pane");
if (dockLeftPane != null)
{
dockLeftPane.Children.Add(anchorableToShow);
return true;
}
return false;
}
return false;
}
Поэтому мне любопытно, каков правильный подход для достижения этого. Я также думал о восстановлении макета (снова) после загрузки MapPanel, но я не знаю, как пропустить все остальные элементы макета. Итак, есть ли возможность восстановить одну позицию Anchorable, плавающий родитель, стыковку, размер и т. Д.?