上下文
我正在使用来自Exrin存储库的ExrinSampleMobileApp。当我用滑动显示导航抽屉时,抽屉显示正确。当我单击“设置”导航时(在我将MenuOperation更正为return new NavigationResult(Stacks.Main, Main.Settings);之后,它正确地导航,但抽屉仍然位于顶部。
我知道的IsPresented应该设置为false以隐藏抽屉。为此,我还发现存在一个抽象IMasterDetailContainer,它为此提供了一个属性(也称为IsPresented)。
问题
但是,也有一些问题:何时何地将该属性设置为false,以及如何访问它(我的意思是如何访问IMasterDetailContainer实现者?)
当我无法弄清楚所有细节,也无法添加已完成的Autofac构建器IMasterDetailContainer实现后,我决定通过一个静态引用传递它是否有效。不幸的是,没有,请参阅带有注释的源代码:
// Note: This code from the otherwise unchanged ExrinSampleMobileApp from the Exrin repository
public class MenuOperation : ISingleOperation
{
public static IMasterDetailContainer Mdc;
private IMasterDetailContainer _masterDetailContainer;
public MenuOperation(IMasterDetailContainer masterDetailContainer)
{
_masterDetailContainer = masterDetailContainer;
}
public Func<object, CancellationToken, Task<IList<IResult>>> Function
{
get
{
return (parameter, token) =>
{
// _masterDetailContainer = false
// Shame, but no DI worked, so this is only for diagnostics (static):
// This set really false, however the drawer remains and navigation freezed.
Mdc.IsPresented = false;
return new NavigationResult(Stacks.Main, Main.Settings);
// Original navigation was:
//return new NavigationResult(Containers.Main, Regions.Main, Stacks.Second, Second.Detail);
};
}
}发布于 2017-09-19 20:55:37
我不太熟悉Exrin,所以可能有更好的方法来实现这一点,但是使用信息传递中心怎么样?您将得到很好的解耦,并且可以在MainContainer中运行一段代码来正确地隐藏菜单,使其不受MenuOperation类的影响。
MenuOperation:
return (parameter, token) =>
{
// MainContainer will subscribe to this message and hide the drawer
MessagingCenter.Send<MenuOperation> (this, "HideDrawer");
return new NavigationResult(Stacks.Main, Main.Settings);
...MainContainer:
public MainContainer(TabbedViewContainer mainStack, MenuStack menuStack) : base(Containers.Main.ToString())
{
MessagingCenter.Subscribe<MenuOperation> (this, "HideDrawer", (sender) =>
{
IsPresented = false;
}
...我还看到人们像您一样保存静态引用,但是保存在App.xaml.cs文件上。然而,在我看来,这造成了不必要的肤色。
发布于 2017-09-20 02:02:29
我发现最好的方法是修改NavigationProxy,在PushAsync和PopAsync上。用这个替换它们,并根据需要进行修改。
public async Task PopAsync()
{
CloseMenu();
await _page.PopAsync();
}
public async Task PushAsync(object page)
{
var xamarinPage = page as Page;
if (xamarinPage == null)
throw new Exception("PushAsync can not push a non Xamarin Page");
CloseMenu();
await _page.PushAsync(xamarinPage, true);
}
private void CloseMenu()
{
if (Application.Current.MainPage is MasterDetailPage masterDetailPage)
masterDetailPage.IsPresented = false;
}https://stackoverflow.com/questions/46308407
复制相似问题