是否可以检查区域内正在使用哪个视图? 我正在使用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) ...
有什么想法吗?
答案 0 :(得分:2)
这取决于您要执行代码的目标位置。
如果您在视图模型中,则可以在视图模型上放置 IActiveAware 界面。它为您提供了IsActive和事件IsActiveChanged。
如果您在视图模型之外,则可以使用 RegionManager 。每个区域都是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));
}