Сложный сценарий с призмой навигации на основе вида - менеджер региона не содержит регион - PullRequest
0 голосов
/ 03 ноября 2018

У меня сложный сценарий с навигацией на основе вида с использованием Prism. Я пытаюсь определить новый NavigationRegion для некоторых модулей в области navitagion родительского модуля.

Я объясню себе:

В моем решении есть следующие проекты:

  • Shell
  • Shell.Module1
  • Shell.Module2
  • Shell.Module3
  • Shell.Module3.SubModule1
  • Shell.Module3.SubModule2

В представлении оболочки я определяю MainNavigationRegion и MainContentRegion. В модуле 1 и 2 загрузите элемент навигации в MainNavigationRegion, а представление - в MainContentRegion. Это работает нормально.

Сложность связана с модулем 3, поскольку сам модуль 3 не имеет функциональности. Вот этот NavigationItemView проекта "Shell.Module3", который загружен в MainNavigationRegion:

<Grid HorizontalAlignment="Center">
    <materialDesign:PopupBox x:Name="NavigateToToolsRadioButton" 
    AutomationProperties.AutomationId="ToolsRadioButton" PopupMode="Click" 
    StaysOpen="False" UseLayoutRounding="False" 
    Style="{StaticResource MaterialDesignMultiFloatingActionAccentPopupBox}"  
    PlacementMode="RightAndAlignMiddles">
        <StackPanel Orientation="Horizontal" x:Name="NavigationItemsControl" 
            prism:RegionManager.RegionName="ToolsNavigationRegion">                
        </StackPanel>
    </materialDesign:PopupBox>
</Grid>

В NavigationItemView модуля 3 (который загружен в MainNavigationRegion) я определяю новый NavigationRegion специально для подмодулей модуля 3. Однако в методе Initialize () класса Module3.SubModule1 я получаю эту ошибку: «Диспетчер регионов не содержит регион ToolsNavigationRegion». Это метод:

public void Initialize()
{
    var navitagionView = Container.Resolve<EarnedValueMethodNavigationItemView>();
    RegionManager.Regions[RegionNames.ToolsNavigationRegion].Add(navitagionView);
    var mainView = Container.Resolve<EarnedValueMethodView>();
    RegionManager.Regions[RegionNames.MainContentRegion].Add(mainView);
}

Если я отлаживаю свойство RegionManager, я вижу, что там нет ToolsNavigationRegion.

Если я изменю эту строку:

RegionManager.Regions[RegionNames.ToolsNavigationRegion].Add(navitagionView);

этой другой строкой:

RegionManager.Regions[RegionNames.MainNavigationRegion].Add(navitagionView);

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

EDIT:

Я также создал адаптер области StackPanel следующим образом:

public class StackPanelRegionAdapter : RegionAdapterBase<StackPanel>
{
    public StackPanelRegionAdapter(IRegionBehaviorFactory factory)
        : base(factory)
    {

    }

    protected override void Adapt(IRegion region, StackPanel regionTarget)
    {
        region.Views.CollectionChanged += (s, e) =>
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
            {
                foreach (FrameworkElement element in e.NewItems)
                {
                    regionTarget.Children.Add(element);
                }
            }

            //implement remove
        };
    }

    protected override IRegion CreateRegion()
    {
        return new AllActiveRegion();
    }
}

1 Ответ

0 голосов
/ 07 ноября 2018

Расширяем комментарий выше:

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

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

Скопировано из этого ответа :

Вероятно, вам нужно установить менеджер региона вручную, в коде всплывающего окна (конструктор), например:

RegionManager.SetRegionName( theNameOfTheContentControlInsideThePopup, WellKnownRegionNames.DataFeedRegion );
RegionManager.SetRegionManager( theNameOfTheContentControlInsideThePopup, theRegionManagerInstanceFromUnity );

Вам нужно будет присвоить имя контролю контента, в котором находится регион, и каким-то образом приобрести менеджера региона (ServiceLocator.Current.GetInstance<IRegionManager>()).

...