Как активировать следующий или последний вид региона? - PullRequest
0 голосов
/ 24 февраля 2012

В моем приложении я использую Prism, и он загружает три модуля путем обнаружения (Unity).

Когда модули загружаются, они регистрируют каждый вид в регионе «TopLeftRegion».

Я пытаюсь выполнить навигацию по представлениям модулей. Я имею в виду, создать Before и Next методы, где можно активировать (или ["TopLeftRegion"].Activate(..)) текущий вид в этом регионе.

Например, представьте, что у меня есть:

|_ModuleA
|
|_ModuleB
|
|_ModuleC

Если мой текущий вид ModuleA, если я нажимаю Next, должен отображаться ModuleB, если я нажимаю Before, должен отображаться ModuleA в этом регионе.

Я наблюдал за имуществом:

regionManager.Regions["TopLeftRegion"].Views

Но я не знаю, как это сделать. Свойство View не позволяет получить доступ к данным и перейти к ним.

Вот простой проект, я пытаюсь создать этот метод в ShellViewModel, и я не получаю его. Как я могу сделать для навигации каждого модуля?

http://www.mediafire.com/?urnrwkrb29osrle

1 Ответ

1 голос
/ 26 февраля 2012

Prism не предполагает, что в регионе есть только одно активное представление, поэтому в классе Region нет никаких свойств, которые сделали бы это очень простым.Но это не так сложно.

Класс RegionManager отслеживает, какие представления активны в свойстве ActiveViews.Он не отслеживает, какой из видов активен.В вашем случае ваш регион поддерживает только одно активное представление, поэтому вы можете просто найти первое представление в этой коллекции.

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

    private void Next(object commandArg)
    {
        IRegion myRegion = _regionManager.Regions["TopLeftRegion"];
        object activeView = myRegion.ActiveViews.FirstOrDefault();  //Here we're trusting that nobody changed the region to support more than one active view
        List<object> myList = myRegion.Views.ToList<object>();      //Cast the list of views into a List<object> so we can access views by index

        int currentIndex =  myList.FindIndex(theView => theView == activeView);
        int nextIndex = (currentIndex + 1) % (myList.Count);        //Wrap back to the first view if we're at the last view
        object nextView = myList[nextIndex];
        myRegion.Activate(nextView);  
    }

Переход к предыдущему представлению будет в основном таким же, за исключением того, что вы вычтете один из индекса вместо добавления одного.

...