如何在Xamarin表单的MasterDetailPage中禁用母版页
本文关键字:母版页 MasterDetailPage Xamarin 表单 | 更新日期: 2023-09-27 18:07:30
我正在使用Xamarin
表单,我需要禁用我用作上下文菜单的Master
页面,这取决于用户是否登录。我有Master
和Detail
页作为单独的XAML
页。
<MasterDetailPage.Master>
<view:MenuPage/>
</MasterDetailPage.Master>
<MasterDetailPage.Detail>
<view:MainViewPage
x:Name="MainView"/>
</MasterDetailPage.Detail>
正如你可能已经猜到的那样,我试图在这里合并MVVM
,所以我尝试绑定Master
页面的可见性(IsVisible
)和启用(IsEnabled
)属性,但是,当按导航按钮访问我的菜单时,我仍然得到不希望的黑色淡出效果。相反,我需要完全忽略按键动作
无论用户是否连接,您的页面都应该是可见的吗?或者在应用程序的开始处有一个登录页面?
如果你没有两个连接的用户都可见的页面,你可以通过定义它为ContentPage来实现登录页面或其他页面。它会占用所有的屏幕空间并隐藏导航栏。然后在用户连接之后,你调用一个页面作为MasterDetailPage,然后你会有你的导航栏,…
不知道这是不是你要找的,但我希望我能帮到你。
这可以通过自定义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;
}