Wpf 是否可以检查区域内正在使用的视图?

Wpf 是否可以检查区域内正在使用的视图?,wpf,mvvm,view,prism,Wpf,Mvvm,View,Prism,是否可以检查区域内正在使用的视图? 我正在使用MVVM 我当时得到了这个密码: Application.Current.Dispatcher.InvokeAsync(() => { var countactiveviews = RegionManager.Regions.First(x => x.Name == "MainRegion").ActiveViews; if (!countactiveviews.Any()

是否可以检查区域内正在使用的视图? 我正在使用MVVM

我当时得到了这个密码:

Application.Current.Dispatcher.InvokeAsync(() =>
        {
            var countactiveviews = RegionManager.Regions.First(x => x.Name == "MainRegion").ActiveViews;

            if (!countactiveviews.Any())
            {
                //// Show preview
                var modulePreview = new Uri(_view.Replace("GridView", "Preview"), UriKind.Relative);
                RegionManager.RequestNavigate(Regions.PropertiesRegion, modulePreview);         
            }

            else
            {

            }
当此时正在使用或打开_视图时,我希望再次执行该代码

所以在我的else里面:

if(_view is being viewed) ...

有什么想法吗?

这取决于您希望执行代码的目的地

如果您在视图模型内,您可以在视图模型上放置interfaceIActiveAware。为您提供的属性为活动,事件为活动更改

如果您在视图模型之外,则可以使用RegionManager。每个区域中都有视图和活动视图集合。您可以检查视图模型的ActiveViews集合。您还可以使用INotifyCollectionChanged接口检测活动视图集合的更改。下一个可以帮助您的是界面INavigationAware。将其放在视图模型上。有一种方法boolIsNavigationTarget(NavigationContext…)可以帮助您识别视图。还可以使用OnNavigatedFrom方法来存储NavigationContext参数,然后在IsNavigationTarget方法中使用它

下面是一个例子:

class MyViewModel : INavigationAware
{
    NavigationContext navigationContext;

    void OnNavigatedFrom(NavigationContext navigationContext)
    {
        this.navigationContext = navigationContext;
    }

    bool IsNavigationTarget(NavigationContext navigationContext)
    {
         return Equals(this.navigationContext.Uri, navigationContext.Uri);
    }

    void OnNavigateTo(NavigationContext navigationContext)
    {
    }
}

...
// somewhere where you need execute

INotifyCollectionChanged activeViews = RegionManager.Regions["MainRegion"].ActiveViews as INotifyCollectionChanged;
if (activeViews!=null)
{
    activeViews.CollectionChanged += ActiveViews_CollectionChanged;
}


...
Uri modulePreview;

void ActiveViews_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    IViewsCollection activeViews = (IViewsCollection)sender;
    NavigationContext navigationContext=new NavigationContext(null, modulePreview);
    activeViews.Any( x=> ((INavigationAware)x).IsNavigationTarget(navigationContext));
}

你说的“用过”是什么意思?
ActiveViews
集合包含区域中可见/活动的所有视图。Prism提供了一个
AllActiveRegion
和一个
SingleActiveRegion
AllActiveRegion
可以包含多个活动视图,而
SingleActiveRegion
只能包含一个。是的,但是我的shell中有一个tabcontrol,我希望从当前正在使用的选项卡中获取视图。是否可以使用regionmanager从tabcontrol获取项目?