1

是否可以检查区域内正在使用哪个视图?我正在使用 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
            {

            }

当 _view 正在使用或打开时,我想再次执行该代码。

所以在我的其他里面:

if(_view is being viewed) ...

有任何想法吗?

4

1 回答 1

2

这取决于您要执行代码的目的地。

如果您在视图模型中,您可以将接口IActiveAware放在您的视图模型上。它为您提供属性 IsActive 和事件 IsActiveChanged。

如果您在视图模型之外,则可以使用RegionManager。每个Region中都有 Views 和 ActiveViews 集合。您可以检查您的视图模型的ActiveViews集合。您还可以使用 INotifyCollectionChanged 接口来检测活动视图集合是否更改。接下来可以帮助您的是接口INavigationAware。把它放在你的视图模型上。有一种方法 bool IsNavigationTarget (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));
}
于 2013-08-23T09:12:49.913 回答