2

我正在使用Xamarin表单,我需要Master根据用户是否登录来禁用用作上下文菜单的页面。我将MasterDetail页面作为单独的XAML页面。

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

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

正如您可能已经猜到的那样,我试图在MVVM这里合并,所以我尝试绑定页面的可见性(IsVisible)和启用(IsEnabled)属性Master,但是,当按下导航按钮访问我的菜单时,我仍然会得到不希望的黑色淡入淡出效果。相反,我需要完全吃掉按钮按下动作。

4

2 回答 2

0

这可以通过自定义 NavigationRenderer 来实现,方法是使用自定义逻辑覆盖抽屉图标的 Click 事件。

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

然后只需订阅消息 MessagingCenter.Subscribe<IMessageSender>(this, "ToggleMasterIsPresented", OnToggleMasterIsPresented); 并处理它。

    private void OnToggleMasterIsPresented(IMessageSender obj)
    {
        _masterDetailPage.IsPresented = !_masterDetailPage.IsPresented;
    }
于 2017-03-22T10:34:03.760 回答
0

当用户连接或不连接时,您的页面是否可见?或者您在应用程序的开头是否有一个登录页面?

如果您没有两个连接的用户都可以看到的页面,您可以通过将登录页面或其他页面定义为 ContentPage 来实现它。它将占用所有屏幕空间并隐藏导航栏。然后在用户连接后,您将页面称为 MasterDetailPage,然后您将拥有您的导航栏,...

不知道这是否是您正在寻找的,但我希望我能够帮助您。

于 2015-08-21T15:14:54.070 回答