【问题标题】:How to disable Master page in MasterDetailPage of Xamarin Forms如何在 Xamarin 表单的 MasterDetailPage 中禁用母版页
【发布时间】:2015-11-03 16:46:50
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# xaml mvvm xamarin-forms


    【解决方案1】:

    是否应该在用户连接时显示您的页面? 或者您在应用程序的开头是否有一个登录页面?

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

    不知道这是否是你要找的,但我希望我能帮助你。

    【讨论】:

    • 我当然可以。所以首先你有你的应用程序类,它会将你的 MainPage 定义为在启动屏幕之后立即显示的页面,就像这样:MainPage = new LoginPage(); 然后你的 LoginPage 需要是 ContentPage 而不是 MasterDetailPage。有了这个,它将是一个没有任何导航栏的全屏页面。如果用户已登录,您将重定向到 MasterDetailPage,该页面将具有左侧菜单。在该页面上,您将定义 Master & Detail 页面。详细信息页面将通过 NavigationPage 访问。详细信息页面是一个带有菜单的简单页面(例如列表视图)。
    • 目前似乎没有办法用 MasterDetail 页面做我想做的事。因此,按照建议,我将为注册用户和新用户使用两个单独的页面。谢谢
    • 没问题。如果您在实施时遇到问题,请不要犹豫。
    【解决方案2】:

    这可以通过自定义 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&lt;IMessageSender&gt;(this, "ToggleMasterIsPresented", OnToggleMasterIsPresented); 并处理它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 2020-06-28
      • 2017-03-16
      • 2017-01-24
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多