2009-08-29 6 views
1

Я получаю скорость на Composite WPF, создавая небольшое демонстрационное приложение для работы по этим проблемам. Мое приложение имеет один регион и два модуля, модуль A и модуль B. Каждый модуль содержит простой текстовый блок «Hello World». Оба модуля настроены как загрузка по требованию, согласно this MSDN How-To.Композитный WPF: отображение/скрытие просмотров?

Корпус имеет две кнопки: «Load Module A» и «Load Module B». При нажатии кнопки загружается соответствующий модуль. Итак, скажем, я нажимаю «Load Module A», затем «Load Module B». Модуль A, а затем модуль B нагрузки, как ожидалось. Но если я снова нажму «Загрузить модуль А», ничего не произойдет.

Я застрял в этой точке. Я думаю, что моя проблема в том, что мне нужно активировать и деактивировать представления в модулях, а не использовать нагрузку по требованию. Но я понятия не имею, как это сделать, и я не могу найти ни документацию, ни блоги, которые об этом говорят.

Итак, вот мой вопрос: как загрузить/выгрузить (или показать/скрыть) виды? Если кто-то может указать мне пример кода, я бы очень признателен. Спасибо за вашу помощь.

ответ

5

Я нашел свой ответ. Вот такой подход: загрузите все модули при запуске, затем активируйте и деактивируйте представления по мере необходимости. Я собираюсь написать эту проблему в качестве статьи 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.

David Veeneman
Системы прогнозирования

Смежные вопросы