gpt4 book ai didi

c# - MVVM 光 5.0 : How to use the Navigation service

转载 作者:IT王子 更新时间:2023-10-29 04:53:35 27 4
gpt4 key购买 nike

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

但是我自己和我 friend google都找不到怎么用。

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

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

这个库有官方文档吗?因为目前我发现它编码得很好并且工作正常,但是当我必须搜索如何使用它时,我从来没有找到显示如何使用它的文档/示例,除了他的博客有一些条目。这非常令人沮丧。我找到的唯一文档是 this , 我对 Pluralsight 不是很熟悉,但似乎必须按月订阅(作为个人,试图在我的空闲时间申请,这是不可能的)。

最佳答案

是的,MvvmLight 在其最新版本中引入了 NavigationService but they did't offer any implementation regarding 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 是一个简单的 Frame 控件的 x:Name 定义在 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);
}

第三: 最后,使用服务,例如

 public LoginViewModel(IFrameNavigationService navigationService)
{
_navigationService = navigationService;
}
...
_navigationService.NavigateTo("Notes",data);
..

编辑

可以在这个 repo 找到一个明确的例子.

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com