У меня сложный сценарий с навигацией на основе вида с использованием 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();
}
}