Области призмы не отображают зарегистрированные виды - PullRequest
1 голос
/ 04 августа 2010

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

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

RegionManager.RegisterViewWithRegion("MyRegion1", typeof(IMySubView1));
RegionManager.RegisterViewWithRegion("MyRegion2", typeof(IMySubView2));

У меня есть представлениереализуя интерфейс IMyView, в котором xaml имеет два элемента управления контентом с областями, определенными в сетке, например:

<ContentControl Regions:RegionManager.RegionName="MyRegion1" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Row="0" Grid.RowSpan="1"/>
<ContentControl Regions:RegionManager.RegionName="MyRegion2" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" Grid.Row="1" Grid.RowSpan="1"/>

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

Метод 1:

object obj = _container.Resolve<IMyView>();
IRegion mainRegion = _regionManager.Regions["MainViewRegion"];
IRegionManager scoped = mainRegion.Add(obj, "test", true);
mainRegion.Activate(obj);

// Enabling the following call, it will fail saying the region MyRegion1 does not exist. Feels like it should?
// IRegion myRegion = scoped.Regions["MyRegion1"];

Метод 2:

object obj = _container.Resolve<IMyView>();
_regionManager.AddToRegion("MainViewRegion", obj);
_regionManager.Regions["MainViewRegion"].Activate(obj);

Такое ощущение, что регионы, определенные в файле xaml, не регистрируются, и из-за этого зарегистрированные представления не отображаются.

MainViewRegion определен в оболочке вTabControl как это:

<TabControl Margin="8,0,8,8" Regions:RegionManager.RegionName="MainViewRegion">

Любые предложения по решению моей проблемы будут с благодарностью!

Ответы [ 4 ]

0 голосов
/ 06 декабря 2010

Проблема исчезла в Prism версии 4.0, я запускал Prism версии 2.2, когда возникла проблема.

0 голосов
/ 12 августа 2010

После многих часов поиска неисправностей я что-то нашел.

В Composite.Presentation \ Regions \ RegionManager.cs есть метод с именем IsInDesignMode. Когда регион собирается быть создан, вызывается этот метод, и если этот метод возвращает true, регион не создается. Смотрите ниже:

private static void OnSetRegionNameCallback(DependencyObject element, DependencyPropertyChangedEventArgs args)
{
    if (!IsInDesignMode(element))
    {
        CreateRegion(element);
    }
}

private static bool IsInDesignMode(DependencyObject element)
{
    // Due to a known issue in Cider, GetIsInDesignMode attached property value is not enough to know if it's in design mode.
    return DesignerProperties.GetIsInDesignMode(element) || Application.Current == null
           || Application.Current.GetType() == typeof(Application);
}

Когда наше приложение silverlight запускается и создаются области в оболочке, все в порядке, свойство Application.Current имеет тип «MyName.Shell.App». Но когда представление добавляется после запуска, как ответ на пользовательский ввод, тип Application.Current внезапно имеет тип «Приложение», и, таким образом, метод IsInDesignMode возвращает true, а регионы не создаются.

Если я удаляю Application.Current условия все работает как положено. Итак, вопрос в том, что-то не так в моем приложении или что-то не так в исходном коде призмы?

0 голосов
/ 16 августа 2010

откуда ваш _regionManager?Вы написали правильный BootStrapper?Вам нужно написать класс, унаследованный от MefBootstrapper или UnityBootstrapper (или пользовательский, если вы не используете ни один из этих IoC / Extension Framework), чтобы зарегистрировать все необходимые типы в контейнере IoC.

Вы публикуете код BootStrapper?

0 голосов
/ 06 августа 2010

Я столкнулся с той же проблемой.Идея состоит в том, что по какой-либо причине инъекция вида {mainRegion.Add (obj, "test", true)} для уже созданных областей не показывает вид.Обходной путь, который работал для меня, состоит в том, чтобы создать область из кода, а затем внедрить представление.Примерно так:

Microsoft.Practices.Composite.Presentation.Regions.RegionManager.SetRegionManager (headerRegionContainer, _RegionManager);Microsoft._RegionManager.Regions [regionName] .Add (вид);_RegionManager.Regions [regionName] .Activate (view);

К сожалению, для меня я не могу достичь своей цели таким образом, но, может быть, вы можете.Levente

...