解决方法
这是一个完整的实现示例,可以通过添加一个完全替换MvvmLight中的新接口来解决问题,并且还允许您选择是否使用动画.在此示例中,我们添加了控制导航是否应设置动画的功能:
接口
public interface ICustomNavigationService { string CurrentPageKey { get; } void GoBack(bool animate = true); void Navigateto(string pageKey,bool animate = true); void Navigateto(string pageKey,object parameter,bool animate = true); }
履行
public class NavigationService : ICustomNavigationService { private readonly Dictionary<string,Type> _pagesByKey = new Dictionary<string,Type>(); private NavigationPage _navigation; public NavigationPage Navigation { get { return _navigation; } } public string CurrentPageKey { get { lock (_pagesByKey) { if (_navigation.CurrentPage == null) { return null; } var pageType = _navigation.CurrentPage.GetType(); return _pagesByKey.ContainsValue(pageType) ? _pagesByKey.First(p => p.Value == pageType).Key : null; } } } public void GoBack(bool animate = true) { _navigation.PopAsync(animate); MessagingCenter.Send<INavigationService>(this,"NAVIGATING"); } public void Navigateto(string pageKey,bool animate = true) { Navigateto(pageKey,null,animate); MessagingCenter.Send<INavigationService>(this,bool animate = true) { lock (_pagesByKey) { if (_pagesByKey.ContainsKey(pageKey)) { var type = _pagesByKey[pageKey]; ConstructorInfo constructor; object[] parameters; if (parameter == null) { constructor = type.GetTypeInfo() .DeclaredConstructors .FirstOrDefault(c => !c.GetParameters().Any()); parameters = new object[] { }; } else { constructor = type.GetTypeInfo() .DeclaredConstructors .FirstOrDefault( c => { var p = c.GetParameters(); return p.Count() == 1 && p[0].ParameterType == parameter.GetType(); }); parameters = new[] { parameter }; } if (constructor == null) { throw new InvalidOperationException( "No suitable constructor found for page " + pageKey); } var page = constructor.Invoke(parameters) as Page; _navigation.PushAsync(page,animate); } else { throw new ArgumentException( string.Format( "No such page: {0}. Did you forget to call NavigationService.Configure?",pageKey),"pageKey"); } } } public void Configure(string pageKey,Type pageType) { lock (_pagesByKey) { if (_pagesByKey.ContainsKey(pageKey)) { _pagesByKey[pageKey] = pageType; } else { _pagesByKey.Add(pageKey,pageType); } } } public void Initialize(NavigationPage navigation) { _navigation = navigation; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。