2010-05-27 3 views
5

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

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

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

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

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

Престол

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

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

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

ответ

0

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

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

+0

Согласно команде PRISM, инициализация модуля произойдет после инициализации оболочки. См. Здесь: http://msdn.microsoft.com/en-us/library/gg430868(v=pandp.40).aspx, поэтому ваше предположение о том, что пользовательский интерфейс не создается, я считаю неверным. –

1

Двойная проверка 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

Спасибо за ваше время, это было оценено. Но, как я уже говорил ранее, область является нулевой, поскольку код был в методе Initialize модуля, поэтому пользовательский интерфейс еще не создан, поэтому регион не может быть разрешен. Это говорит о том, что ваш ответ дает хороший пример правильного использования регионов. Еще раз спасибо. – esylvestre

+0

Есть ли какое-либо преимущество в деактивации и активации представлений при использовании 'RemoveAll()', а затем добавление нужного представления? Благодарю. –

3

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

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

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

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

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

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