Prism: изменить активный вид - PullRequest
5 голосов
/ 27 мая 2010

У меня есть маленький инструмент, похожий на панель управления Windows. Инструмент позволяет нам управлять пользователями, настраивать базы данных, управлять скриптами и т. Д. На главной странице представлены все подкатегории приложения. Когда вы нажимаете на ссылку, он загружает представление этой категории на правой панели, а небольшая левая панель показывает задачи, доступные для этой категории. Простой.

По сути, я хочу иметь «контекстную» строку состояния. Если вы находитесь в представлении, где вам нужно подключиться, в строке состояния должно отображаться ваше состояние. Если вы находитесь в представлении, где информация должна отображаться, я хочу, чтобы она была в моей строке состояния.

Я уже положил Region (с именем StatusBarRegion для строки состояния в моей оболочке. Для каждого модуля я зарегистрировал StatusBarView этого модуля в области оболочки.

Теперь я хочу справиться со сменой контекста. Мне нужно активировать хороший вид, когда придет время.

Но каждый раз, когда я пытаюсь разрешить StatusBarRegion , его нельзя найти в регионах регионального менеджера.

См

var region = _regionManager.Regions[.RegionNames.StatusBarRegion];
region.Activate(_container.Resolve<StatusBarView>());

Регион всегда нулевой. Почему это?

Спасибо за ваше время.

Ответы [ 4 ]

3 голосов
/ 17 декабря 2010

Я считаю, что ваша ошибка связана с

region.Activate(_container.Resolve<StatusBarView>());

а не

var region = _regionManager.Regions[.RegionNames.StatusBarRegion];

Есть несколько причин, почему это может быть вашей проблемой, и я дам вам решения, которые вы можете попробовать.

Во-первых, , region.Activate() требует, чтобы экземпляр представления уже существовал в этом регионе. Так что из вашего кода я подозреваю, что _container.Resolve<StatusBarView>() дает вам новый экземпляр StatusBarView и, следовательно, не будет существовать в этом регионе.

Решение: при регистрации StatusBarView в контейнере рассмотрите одноэлементное представление.

_container.RegisterType<IStatusBarView,StatusBarView>
    (new ContainerControlledLifetimeManager())

Во-вторых , вы должны зарегистрировать тип вида (или добавить его вручную) в регион, прежде чем активировать его.

Решение:

_regionManager.RegisterViewWithRegion
    (RegionNames.StatusBarRegion, typeof(IStatusBarView));

В качестве альтернативы:

_regionManager.Regions[RegionNames.StatusBarRegion]
    .Add(_container.Resolve<StatusBarView>());
1 голос
/ 30 марта 2011

У меня была похожая проблема некоторое время назад. Я разместил вопрос здесь , но затем выяснил проблему и решение.

Моя проблема заключалась в том, что мой регион не был определен в Shell. Проверьте полный вопрос и ответ здесь .

Надеюсь, это поможет.

1 голос
/ 03 июня 2010

Перепроверьте значение RegionNames.StatusBarRegion, если оно уже совпадает с областью назначения в вашей оболочке.

Если это так, регион не должен быть нулевым, я думаю, за исключением того, что вы поместили свой дескриптор в view / viewmodel модуля, а у вас не было менеджера региона и контейнера в конструкторе.

Допустим, это обработано на ваш взгляд SilverlightUserControl1. Конструктор может быть таким:

private readonly IRegionManager _regionManager;
private readonly IUnityContainer _container;

public SilverlightUserControl1(IRegionManager regionManager, IUnityContainer container)
{
    _regionManager = regionManager;
    _container = container;
}

private Button1_Click(object sender, RoutedEventArgs e)
{
    var statusBarView = _container.Resolve<StatusBarView>();
    statusBarRegion = _regionManager.Regions["StatusBarRegion"];

    statusBarRegion.Add(statusBarView, "StatusBarView");
    statusBarRegion.Activate(statusBarView);

    // or you could remove all views in `ActiveViews` and add the view then
    // (no need to activate)
}
0 голосов
/ 28 мая 2010

Причина, по которой регион был нулевым? Кусок кода был в методе Initialize модуля , поэтому пользовательский интерфейс еще не был создан.

Для лучшего способа управления строками состояния мне все еще интересно, как я это сделаю.

...