xamarin – 如何在mvvmlight中实现自定义导航服务

前端之家收集整理的这篇文章主要介绍了xamarin – 如何在mvvmlight中实现自定义导航服务前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我对现有的MVVMlight导航界面方法不太满意,而且非常小,我想实现我自己的导航界面,我可以在其中展示操纵导航堆栈并将其与MVVM灯集成的复杂方法.

任何有关实现这一目标的指导都非常感谢

更新:

我想实现页面之间移动的其他过渡,如页面卷曲,翻转,旋转等

解决方法

这是一个完整的实现示例,可以通过添加一个完全替换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;
    }

}

从这里,您可以添加其他您想要的方法.确保注入此内容或直接在您使用MvvmLight之前使用它.

猜你在找的Android相关文章