Я нашел свой ответ. Вот подход: загрузите все модули при запуске, затем активируйте и деактивируйте представления по мере необходимости. Я собираюсь написать эту проблему как статью CodeProject, но вот краткое описание того, как это сделать:
(1) В методе Initialize () модуля добавьте модуль, но не активируйте его:
public void Initialize()
{
// Get main region
var mainRegion = m_RegionManager.Regions["MainRegion"];
// Load Module B
var newView = new ModuleBView();
mainRegion.Add(newView, "ModuleA.ModuleAView");
}
Обратите внимание, что метод Add () имеет два параметра. Второй параметр - это имя представления, для которого мы устанавливаем значение, полученное с помощью метода ToString () представления. Мы увидим почему на следующем шаге.
(2) При активации вида нам нужно отключить предыдущий вид. Но мы можем не знать имя представления, поэтому мы отключаем все активные представления:
public static void ClearRegion(IRegion region)
{
// Get existing view names
var oldViewNames = new List<string>();
foreach (var v in region.Views)
{
var s = v.ToString();
oldViewNames.Add(s);
}
// Remove existing views
foreach (var oldViewName in oldViewNames)
{
var oldView = region.GetView(oldViewName);
region.Deactivate(oldView);
}
}
Поскольку мы устанавливаем имя каждого представления равным его значению ToString (), мы можем легко получить имена, ничего не зная о них заранее.
(3) Теперь мы активируем новый вид. Я делаю это в методе MVVM ICommand.Execute ():
public void Execute(object parameter)
{
// Get main region
var mainRegion = m_ViewModel.RegionManager.Regions["MainRegion"];
// Clear region
ModuleServices.ClearRegion(mainRegion);
// Activate Module A view
var moduleAView = mainRegion.GetView("ModuleA.ModuleAView");
mainRegion.Activate(moduleAView);
}
Надеюсь, этого будет достаточно, чтобы вы пошли. Как я уже сказал, я планирую сделать более полную запись с демонстрационным кодом для CodeProject.
Дэвид Вениман
Системы предвидения