简体   繁体   English

如何在Xamarin Forms的MasterDetailPage中禁用母版页

[英]How to disable Master page in MasterDetailPage of Xamarin Forms

I am working with Xamarin forms and I need to disable the Master page that I use as context menu depending on whether user is logged in or not. 我正在使用Xamarin表单,并且需要根据用户是否登录来禁用用作上下文菜单的Master页。 I have both Master and Detail pages as separate XAML pages. 我有“ Master和“ Detail页面作为单独的XAML页面。

  <MasterDetailPage.Master>
    <view:MenuPage/>
  </MasterDetailPage.Master>

  <MasterDetailPage.Detail>
    <view:MainViewPage 
      x:Name="MainView"/>
  </MasterDetailPage.Detail> 

As you might have guessed, I am trying to incorporate MVVM here, so I tried binding visibility ( IsVisible ) and enabled ( IsEnabled ) properties of the Master page, however, I still get the undesired black fade effect when pushing navigation button to access my menu. 您可能已经猜到了,我试图在此处合并MVVM ,所以我尝试了绑定可见性( IsVisible )和启用( IsEnabledMaster页属性,但是,当按导航按钮访问我的IsEnabled时,我仍然会得到不希望的黑色淡入效果菜单。 Instead, I need to completely eat up the button press action. 相反,我需要完全吃完按钮按下动作。

Should your pages be visible whenever the user is connected or not ? 无论何时与用户连接,您的页面都应该可见吗? Or do you have a login page at the start of the application for example ? 还是例如在应用程序的开头有登录页面?

If you don't have pages that are visible by both connected users or not, you could implement the login page or another page by defining it as ContentPage. 如果没有两个连接的用户都可以看到的页面,则可以通过将登录页面或其他页面定义为ContentPage来实现该页面。 It will take all the screen space and hide the navigationBar. 它将占用所有屏幕空间并隐藏navigationBar。 Then after user connect you call a page as MasterDetailPage and then you will have your navigationBar, ... 然后,在用户连接后,您将页面称为MasterDetailPage,然后将获得您的navigationBar,...

Don't know if that's what you're looking for but i hope i was able to help you. 不知道这是您要找的东西,但我希望我能为您提供帮助。

This can be achieved with a custom NavigationRenderer, by overriding the Click event of the drawer icon with your custom logic. 通过使用自定义逻辑覆盖抽屉图标的Click事件,可以使用自定义的NavigationRenderer实现。

[assembly: ExportRenderer(typeof(NavigationPage), typeof(CustomNavigationPageRenderer))]
namespace RTW.Mobile.App.Droid.Renderers
{
    public class CustomNavigationPageRenderer : NavigationPageRenderer, IMessageSender
    {
        protected override void OnLayout(bool changed, int l, int t, int r, int b)
        {
            base.OnLayout(changed, l, t, r, b);

            var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            for (var i = 0; i < toolbar.ChildCount; i++)
            {
                var imageButton = toolbar.GetChildAt(i) as ImageButton;
                var drawerArrow = imageButton?.Drawable as DrawerArrowDrawable;

                if (drawerArrow == null)
                    continue;

                //ensure only one handler is registered
                imageButton.Click -= imageButton_Click;
                imageButton.Click += imageButton_Click;
            }
        }

        private void imageButton_Click(object sender, EventArgs e)
        {
            if (!App.IsBlockingConditionTrue)
            {
                MessagingCenter.Send<IMessageSender>(this, "ToggleMasterIsPresented");
            }
        }
    }
}

Then just subscribe to the message with MessagingCenter.Subscribe<IMessageSender>(this, "ToggleMasterIsPresented", OnToggleMasterIsPresented); 然后只需使用MessagingCenter.Subscribe<IMessageSender>(this, "ToggleMasterIsPresented", OnToggleMasterIsPresented);订阅该消息MessagingCenter.Subscribe<IMessageSender>(this, "ToggleMasterIsPresented", OnToggleMasterIsPresented); and handle it. 并处理它。

    private void OnToggleMasterIsPresented(IMessageSender obj)
    {
        _masterDetailPage.IsPresented = !_masterDetailPage.IsPresented;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM