Prism 6 ContainsRegionWithName激活视图

时间:2017-02-08 12:56:04

标签: prism

我已经将我的项目从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类。

如果我做错了,请纠正我。

此致 拉姆

0 个答案:

没有答案