the latest release of MVVM Light note中,已指示MVVM Light现在提供“导航服务”。

但是我自己和我的 friend google无法找到如何使用它。

我可以看到可以向ServiceLocator请求一个INavigationService,因此可以看到如何请求转到另一个页面,但是:

  • 我创建了一个新窗口,希望在其中为“页面”保留一个特定区域,如何指定呢?
  • 如何指定所有可用页面?我应该打电话吗?
  • INavigationService的参数格式是什么

  • 该库有任何官方文档吗?因为目前我发现它的编码很好并且可以正常工作,但是当我必须搜索如何使用它时,除了他的博客中有一些条目,我再也找不到任何文档/示例来说明如何使用它。这非常令人沮丧。我找到的唯一文档是this,我对Pluralsight不太熟悉,但似乎必须每月订阅一次(作为个人,这是试图在业余时间制作应用程序的可能性, )。

    最佳答案

    是的,MvvmLight在最新版本的but they did't offer any implementation regarding NavigationService 中引入了Wpf(您可以在WP,Metroapps等中使用已实现的NavigationService),但不幸的是,不是Wpf,您需要自己实现,
    这是我目前的工作方式(credit)

    首先创建您的导航界面,该界面实现MvvmLight INavigationService

    public interface IFrameNavigationService : INavigationService
    {
        object Parameter { get; }
    }
    
    Parameter用于在ViewModels之间传递对象,并且INavigationServiceGalaSoft.MvvmLight.Views命名空间的一部分

    然后像这样实现该接口(interface)
        class FrameNavigationService : IFrameNavigationService,INotifyPropertyChanged
        {
            #region Fields
            private readonly Dictionary<string, Uri> _pagesByKey;
            private readonly List<string> _historic;
            private string _currentPageKey;
            #endregion
            #region Properties
            public string CurrentPageKey
            {
                get
                {
                    return _currentPageKey;
                }
    
                private  set
                {
                    if (_currentPageKey == value)
                    {
                        return;
                    }
    
                    _currentPageKey = value;
                    OnPropertyChanged("CurrentPageKey");
                }
            }
            public object Parameter { get; private set; }
            #endregion
            #region Ctors and Methods
            public FrameNavigationService()
            {
                _pagesByKey = new Dictionary<string, Uri>();
                _historic = new List<string>();
            }
            public void GoBack()
            {
                if (_historic.Count > 1)
                {
                    _historic.RemoveAt(_historic.Count - 1);
                    NavigateTo(_historic.Last(), null);
                }
            }
            public void NavigateTo(string pageKey)
            {
                NavigateTo(pageKey, null);
            }
    
            public virtual void NavigateTo(string pageKey, object parameter)
            {
                lock (_pagesByKey)
                {
                    if (!_pagesByKey.ContainsKey(pageKey))
                    {
                        throw new ArgumentException(string.Format("No such page: {0} ", pageKey), "pageKey");
                    }
    
                    var frame = GetDescendantFromName(Application.Current.MainWindow, "MainFrame") as Frame;
    
                    if (frame != null)
                    {
                        frame.Source = _pagesByKey[pageKey];
                    }
                    Parameter = parameter;
                    _historic.Add(pageKey);
                    CurrentPageKey = pageKey;
                }
            }
    
            public void Configure(string key, Uri pageType)
            {
                lock (_pagesByKey)
                {
                    if (_pagesByKey.ContainsKey(key))
                    {
                        _pagesByKey[key] = pageType;
                    }
                    else
                    {
                        _pagesByKey.Add(key, pageType);
                    }
                }
            }
    
            private static FrameworkElement GetDescendantFromName(DependencyObject parent, string name)
            {
                var count = VisualTreeHelper.GetChildrenCount(parent);
    
                if (count < 1)
                {
                    return null;
                }
    
                for (var i = 0; i < count; i++)
                {
                    var frameworkElement = VisualTreeHelper.GetChild(parent, i) as FrameworkElement;
                    if (frameworkElement != null)
                    {
                        if (frameworkElement.Name == name)
                        {
                            return frameworkElement;
                        }
    
                        frameworkElement = GetDescendantFromName(frameworkElement, name);
                        if (frameworkElement != null)
                        {
                            return frameworkElement;
                        }
                    }
                }
                return null;
            }
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
            }
            #endregion
        }
    

    上面代码中的MainFrame是x:简单Frame控件的名称,该名称在Xaml中定义,用于在页面之间导航(根据需要进行自定义)

    第二个:在viewmodellocator中,初始化导航服务(SetupNavigation()),因此可以在 View 模型中使用它:
    static ViewModelLocator()
    {
         ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
    
         SetupNavigation();
    
         SimpleIoc.Default.Register<MainViewModel>();
         SimpleIoc.Default.Register<LoginViewModel>();
         SimpleIoc.Default.Register<NoteViewModel>();
     }
     private static void SetupNavigation()
     {
         var navigationService = new FrameNavigationService();
         navigationService.Configure("LoginView", new Uri("../Views/LoginView.xaml",UriKind.Relative));
         navigationService.Configure("Notes", new Uri("../Views/NotesView.xaml", UriKind.Relative));
    
          SimpleIoc.Default.Register<IFrameNavigationService>(() => navigationService);
     }
    

    第三名: finaly,使用服务,例如
     public LoginViewModel(IFrameNavigationService navigationService)
     {
          _navigationService = navigationService;
     }
    ...
    _navigationService.NavigateTo("Notes",data);
    ..
    

    编辑

    在此repo上可以找到一个明确的样本。

    关于c# - MVVM Light 5.0 : How to use the Navigation service,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28966819/

    10-13 06:24