gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:17:20 24 4
gpt4 key购买 nike

我对现有的 MVVMlight 导航界面方法不太满意,而且这种方法非常少,我想实现我自己的导航界面,我可以在其中公开复杂的方法来操作导航堆栈并将其与 MVVM 灯集成。

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

更新:

我想为页面之间的移动实现其他转换,如 curl 、翻转、旋转等

最佳答案

这是一个完整的实现示例,它可以通过添加一个完全替换 MvvmLight 的新接口(interface)来解决问题,并且还允许您选择是否使用动画。在这个例子中,我们添加了控制导航是否应该动画的能力:

接口(interface)

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, "NAVIGATING");
}

public void NavigateTo(string pageKey, object parameter, 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 的地方注入(inject)或直接使用它。

关于xamarin - 如何在 mvvmlight 中实现自定义导航服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43243754/

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