首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Exrin IMasterDetailContainer IsPresented没有影响,如何隐藏导航抽屉

Exrin IMasterDetailContainer IsPresented没有影响,如何隐藏导航抽屉
EN

Stack Overflow用户
提问于 2017-09-19 19:30:56
回答 2查看 57关注 0票数 1

上下文

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

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

问题

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

当我无法弄清楚所有细节,也无法添加已完成的Autofac构建器IMasterDetailContainer实现后,我决定通过一个静态引用传递它是否有效。不幸的是,没有,请参阅带有注释的源代码:

代码语言:javascript
复制
// 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);
            };
        }
    }
EN

回答 2

Stack Overflow用户

发布于 2017-09-19 20:55:37

我不太熟悉Exrin,所以可能有更好的方法来实现这一点,但是使用信息传递中心怎么样?您将得到很好的解耦,并且可以在MainContainer中运行一段代码来正确地隐藏菜单,使其不受MenuOperation类的影响。

MenuOperation:

代码语言:javascript
复制
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:

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

    ...

我还看到人们像您一样保存静态引用,但是保存在App.xaml.cs文件上。然而,在我看来,这造成了不必要的肤色。

票数 1
EN

Stack Overflow用户

发布于 2017-09-20 02:02:29

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

代码语言:javascript
复制
    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;
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46308407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档