1

语境

我正在使用 Exrin 存储库中的 ExrinSampleMobileApp。当我通过滑动显示导航抽屉时,抽屉显示正确。当我单击“设置”导航时,(在我将 MenuOperation 更正为return new NavigationResult(Stacks.Main, Main.Settings);正确导航后,但抽屉仍位于顶部。

我知道 Xamarin MasterDetailPage 的 IsPresented 应该设置为 false 以隐藏抽屉。我还发现,为此目的,有一个抽象 IMasterDetailContainer 提供了一个属性(也称为 IsPresented)。

问题

但是有一些问题:何时何地将此属性设置为 false 以及如何访问它(我的意思是如何访问 IMasterDetailContainer 实现者?)

在我无法弄清楚所有细节并且无法将 Completed 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);
            };
        }
    }
4

2 回答 2

1

我发现这样做的最好方法是在 PushAsync 和 PopAsync 上修改 NavigationProxy。用这个替换它们,并根据需要进行修改。

    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;
    }
于 2017-09-20T02:02:29.183 回答
1

我不熟悉 Exrin,所以可能有更好的方法来做到这一点,但是使用消息中心怎么样?你会得到很好的解耦,并且可以在MainContainer中运行一段代码来正确地从 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);

    ...

主容器:

public MainContainer(TabbedViewContainer mainStack, MenuStack menuStack) : base(Containers.Main.ToString())
{
    MessagingCenter.Subscribe<MenuOperation> (this, "HideDrawer", (sender) => 
    {
        IsPresented = false;
    }

    ...

我还看到人们像您一样保存静态引用,但保存在 App.xaml.cs 文件中。但是,在我看来,这会造成不必要的复杂性。

于 2017-09-19T20:55:37.290 回答