我已经将我的项目从prism 4转换为prism 6.3.0,当我调用ContainsRegionWithName时我遇到了问题。
ContainsRegionWithName正在激活其中一个视图(棱镜4中没有发生)。 此函数在内部调用UpdateRegion,并调用TryRegisterRegion。但不确定为什么这是注册地区。
此外,发现AutoPopulate行为正在激活该模块。
然后我花了一些时间来了解现有的代码库。
我的项目没有Imodule,它只有View和ViewModel。 我的项目包含2个主要的ContentControl。其中一个是加载菜单项,另一个是根据菜单选择加载相应的主页面。
所有标有属性类的菜单项。
public interface IMenuModule
{
Uri MainViewUri { get; }
object MainView { get; }
}
示例菜单类
[Export(typeof(IMenuModule))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public partial class FirstMenuView
{
public FirstMenuView()
{
InitializeComponent();
DataContext = new FirstMenuViewViewModel();
Dispatcher.BeginInvoke((Action)(() => MainView= new FirstMenuMainPageView()), System.Windows.Threading.DispatcherPriority.Background);
}
public override Uri MainViewUri
{
get
{
return new Uri("FirstMenuMainPageView", UriKind.Relative);
}
}
当用户选择FirstMenu然后主内容控件加载FirstMenuMainPageView。
此FirstMenuMainPageView具有下面列出的视图和视图模型。
FirstMenuMainPageView.xaml
<ContentControl Name="FirstMenuMainPageShellControl"
cal:RegionManager.RegionName="{x:Static local:Regions.ShellRegion}"
cal:RegionManager.RegionManager="{Binding Scoped}" />
FirstMenuMainPageView.xaml.cs
public partial class FirstMenuMainPageView
{
public FirstMenuMainPageView()
{
InitializeComponent();
var model = new FirstMenuMainPageViewModel();
DataContext = model;
RegionManager.SetRegionManager(FirstMenuMainPageShellControl, model.Scoped);
}
}
FirstMenuMainPageViewModel.cs
public class FirstMenuMainPageViewModel: BindableBase, IActiveAware
{
private readonly IRegionManager _regionManager = ServiceLocator.Current.GetInstance<IRegionManager>().CreateRegionManager();
public IRegionManager Scoped
{
get
{
return _regionManager;
}
}
public FirstMenuMainPageViewModel()
{
Scoped.RegisterViewWithRegion(Regions.ShellRegion, typeof(InternalView));
}
protected override void OnActivated()
{
base.OnActivated();
}
}
并在shell.xaml文件中,当用户选择的菜单项导航或包含该视图时(完全不理解此代码)
_selectedModule = _selectedItem as INavigationModule;
var shellView = OwnerWindow as IShellView;
if (shellView != null && null != _selectedItem) shellView.ShowWaitWindow();
//GC.Collect(2, GCCollectionMode.Forced);
if (null != _selectedModule)
{
if (null != _selectedModule.MainView)
{
if (!MainRegion.Views.Contains(_selectedModule.MainView))
{
// DS: never change the running system
var dependencyObject = _selectedModule.MainView as DependencyObject;
IRegionManager manager = null;
if (null != dependencyObject)
manager = RegionManager.GetRegionManager(dependencyObject);
MainRegion.Add(_selectedModule.MainView);
if (null != dependencyObject)
RegionManager.SetRegionManager(dependencyObject, manager ?? _regionManager);
}
MainRegion.Activate(_selectedModule.MainView);
}
else
MainRegion.NavigationService.RequestNavigate(_selectedModule.MainViewUri);
}
else
MainRegion.NavigationService.RequestNavigate(_emptyViewUri);
var view = MainRegion.ActiveViews.FirstOrDefault();
从我理解的代码是View(FirstMenuMainPageView)类实例是由MenuModule创建的,因此我对此行进行了评论
//Dispatcher.BeginInvoke((Action)(() => MainView= new FirstMenuMainPageView()), System.Windows.Threading.DispatcherPriority.Background);
并将[Export]属性修饰放到viewclass(MEFServicelocater找到此类来创建实例)
[Export]
[PartCreationPolicy(CreationPolicy.NonShared)]
[RegionMemberLifetime(KeepAlive = true)]
public partial class FirstMenuMainPageView
然后我没有得到该异常,我也觉得我必须将此属性修饰为FirstMenuMainPageViewModel类。
如果我做错了,请纠正我。
此致 拉姆