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を使用できます。各リージョンには、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 に答える